3 * BlueZ - Bluetooth protocol stack for Linux
5 * Copyright (C) 2006-2010 Nokia Corporation
6 * Copyright (C) 2004-2010 Marcel Holtmann <marcel@holtmann.org>
9 * This program is free software; you can redistribute it and/or modify
10 * it under the terms of the GNU General Public License as published by
11 * the Free Software Foundation; either version 2 of the License, or
12 * (at your option) any later version.
14 * This program is distributed in the hope that it will be useful,
15 * but WITHOUT ANY WARRANTY; without even the implied warranty of
16 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 * GNU General Public License for more details.
19 * You should have received a copy of the GNU General Public License
20 * along with this program; if not, write to the Free Software
21 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
35 #include <sys/ioctl.h>
41 #include <dbus/dbus.h>
43 #include "bluetooth/bluetooth.h"
44 #include "bluetooth/hci.h"
45 #include "bluetooth/hci_lib.h"
46 #include "bluetooth/sdp.h"
47 #include "bluetooth/sdp_lib.h"
51 #include "gdbus/gdbus.h"
56 #include "src/shared/mgmt.h"
57 #include "src/shared/util.h"
58 #include "src/shared/queue.h"
59 #include "src/shared/att.h"
60 #include "src/shared/gatt-db.h"
62 #include "btio/btio.h"
68 #include "dbus-common.h"
70 #include "uuid-helper.h"
73 #include "attrib/gattrib.h"
74 #include "attrib/att.h"
75 #include "attrib/gatt.h"
76 #include "attrib-server.h"
77 #include "gatt-database.h"
78 #include "advertising.h"
81 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
83 #include "adapter_le_vsc_features.h"
84 #include "../profile.h"
87 #define ADAPTER_INTERFACE "org.bluez.Adapter1"
89 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
90 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
91 #define DEVICED_DEST "org.tizen.system.deviced"
92 #define DEVICED_BATT_INTERFACE "org.tizen.system.deviced.Battery"
93 #define DEVICED_BATT_OBJECT_PATH "/Org/Tizen/System/DeviceD/Battery"
94 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
98 #define MODE_CONNECTABLE 0x01
99 #define MODE_DISCOVERABLE 0x02
100 #define MODE_UNKNOWN 0xff
102 #define CONN_SCAN_TIMEOUT (3)
103 #define IDLE_DISCOV_TIMEOUT (5)
104 #define TEMP_DEV_TIMEOUT (3 * 60)
105 #define BONDING_TIMEOUT (2 * 60)
107 #define SCAN_TYPE_BREDR (1 << BDADDR_BREDR)
108 #define SCAN_TYPE_LE ((1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM))
109 #define SCAN_TYPE_DUAL (SCAN_TYPE_BREDR | SCAN_TYPE_LE)
110 #define SETTING_PRIVACY_MASK (1<<13)
112 #define HCI_RSSI_INVALID 127
113 #define DISTANCE_VAL_INVALID 0x7FFF
114 #define PATHLOSS_MAX 137
116 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
117 #define ADV_DATA_MAX_LENGTH 31
118 #define SCAN_RESPONSE_DATA_LENGTH_MAX 31
119 #define EIR_MANUFACTURER_DATA_LENGTH_MAX 100
121 #define LE_BEARER_POSTFIX " LE"
122 #define LE_BEARER_POSTFIX_LEN 3
123 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
126 static DBusConnection *dbus_conn = NULL;
128 static bool kernel_conn_control = false;
130 static GList *adapter_list = NULL;
131 static unsigned int adapter_remaining = 0;
132 static bool powering_down = false;
134 static GSList *adapters = NULL;
136 static struct mgmt *mgmt_master = NULL;
138 static uint8_t mgmt_version = 0;
139 static uint8_t mgmt_revision = 0;
141 static GSList *adapter_drivers = NULL;
143 static GSList *disconnect_list = NULL;
144 static GSList *conn_fail_list = NULL;
146 struct link_key_info {
148 unsigned char key[16];
153 struct smp_ltk_info {
156 uint8_t authenticated;
173 uint16_t min_interval;
174 uint16_t max_interval;
179 struct discovery_filter {
188 struct watch_client {
189 struct btd_adapter *adapter;
193 struct discovery_filter *discovery_filter;
196 struct service_auth {
202 struct btd_device *device;
203 struct btd_adapter *adapter;
204 struct agent *agent; /* NULL for queued auths */
207 struct btd_adapter_pin_cb_iter {
208 GSList *it; /* current callback function */
209 unsigned int attempt; /* numer of times it() was called */
210 /* When the iterator reaches the end, it is NULL and attempt is 0 */
213 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
215 int slot_id; /* Reservied slot id is 0 (Single adv) */
216 bool status; /* Advertising status */
219 static GSList *read_requests = NULL;
221 struct le_data_length_read_request {
222 struct btd_adapter *adapter;
226 struct le_batching_request {
227 struct btd_adapter *adapter;
231 struct le_batching_set_param_request {
232 struct btd_adapter *adapter;
244 bdaddr_t bdaddr; /* controller Bluetooth address */
245 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
246 bdaddr_t le_static_addr;
249 uint8_t bdaddr_type; /* address type */
250 uint32_t dev_class; /* controller class of device */
251 char *name; /* controller device name */
252 char *short_name; /* controller short name */
253 uint32_t supported_settings; /* controller supported settings */
254 uint32_t pending_settings; /* pending controller settings */
255 uint32_t current_settings; /* current controller settings */
257 char *path; /* adapter object path */
258 uint16_t manufacturer; /* adapter manufacturer */
259 uint8_t major_class; /* configured major class */
260 uint8_t minor_class; /* configured minor class */
261 char *system_name; /* configured system name */
262 char *modalias; /* device id (modalias) */
263 bool stored_discoverable; /* stored discoverable mode */
264 uint32_t discoverable_timeout; /* discoverable time(sec) */
265 uint32_t pairable_timeout; /* pairable time(sec) */
267 char *current_alias; /* current adapter name alias */
268 char *stored_alias; /* stored adapter name alias */
269 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
270 uint8_t *local_irk; /* adapter local IRK */
272 bool ipsp_intialized; /* Ipsp Initialization state */
273 struct le_data_length_read_handler *read_handler;
274 struct le_data_length_read_default_data_length_handler *def_read_handler;
275 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
276 guint charging_watch;
277 guint charging_timeout;
278 charging_state_e charging;
279 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
282 bool discovering; /* discovering property state */
283 bool filtered_discovery; /* we are doing filtered discovery */
284 bool no_scan_restart_delay; /* when this flag is set, restart scan
286 uint8_t discovery_type; /* current active discovery type */
287 uint8_t discovery_enable; /* discovery enabled/disabled */
288 bool discovery_suspended; /* discovery has been suspended */
289 bool discovery_discoverable; /* discoverable while discovering */
290 GSList *discovery_list; /* list of discovery clients */
291 GSList *set_filter_list; /* list of clients that specified
292 * filter, but don't scan yet
294 /* current discovery filter, if any */
295 struct mgmt_cp_start_service_discovery *current_discovery_filter;
297 GSList *discovery_found; /* list of found devices */
298 guint discovery_idle_timeout; /* timeout between discovery runs */
299 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
300 guint le_discovery_idle_timeout; /* timeout between le discovery runs */
302 guint passive_scan_timeout; /* timeout between passive scans */
303 guint temp_devices_timeout; /* timeout for temporary devices */
305 guint pairable_timeout_id; /* pairable timeout id */
306 guint auth_idle_id; /* Pending authorization dequeue */
307 GQueue *auths; /* Ongoing and pending auths */
308 bool pincode_requested; /* PIN requested during last bonding */
309 GSList *connections; /* Connected devices */
310 GSList *devices; /* Devices structure pointers */
311 GSList *connect_list; /* Devices to connect when found */
312 struct btd_device *connect_le; /* LE device waiting to be connected */
313 sdp_list_t *services; /* Services associated to adapter */
315 struct btd_gatt_database *database;
316 struct btd_adv_manager *adv_manager;
318 gboolean initialized;
319 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
320 GSList *adv_list; /* List of advertising instance */
321 bool advertising; /* Advertising active */
322 gchar *version; /* Bluetooth Version */
323 uint8_t adv_tx_power;
324 guint adv_restart_timeout;
325 bool le_discovering; /* LE Discovery active */
326 GSList *le_discovery_list; /* list of LE discovery clients */
329 GSList *pin_callbacks;
330 GSList *msd_callbacks;
335 struct oob_handler *oob_handler;
337 unsigned int load_ltks_id;
338 guint load_ltks_timeout;
340 unsigned int confirm_name_id;
341 guint confirm_name_timeout;
343 unsigned int pair_device_id;
344 guint pair_device_timeout;
346 unsigned int db_id; /* Service event handler for GATT db */
347 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
348 uint8_t central_rpa_res_support;
349 bluetooth_a2dp_role_t a2dp_role;
350 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
351 bool scan_filter_support; /* platform's scan filtering support */
352 uint8_t scan_type; /* scan type */
353 GSList *scan_params; /* scan filter parameters */
354 GSList *addr_filters; /* adress scan filters list */
355 GSList *service_data_changed_filters; /* service data changed scan filters list */
356 GSList *service_uuid_filters; /* service uuid scan filters list */
357 GSList *solicit_data_filters; /* solicitation data scan filters list */
358 GSList *local_name_filters; /* local name scan filters list */
359 GSList *manufaturer_data_filters; /* manufacturer data scan filters list */
360 GSList *service_data_filters; /* service data scan filters list */
363 bool is_default; /* true if adapter is default one */
365 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
366 bool le_2m_phy_supported;
367 bool le_coded_phy_supported;
368 guint le_batching_available_pkts;
373 ADAPTER_AUTHORIZE_DISCONNECTED = 0,
374 ADAPTER_AUTHORIZE_CHECK_CONNECTED
375 } adapter_authorize_type;
377 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
384 static struct btd_adapter *btd_adapter_lookup(uint16_t index)
388 for (list = g_list_first(adapter_list); list;
389 list = g_list_next(list)) {
390 struct btd_adapter *adapter = list->data;
392 if (adapter->dev_id == index)
399 struct btd_adapter *btd_adapter_get_default(void)
403 for (list = g_list_first(adapter_list); list;
404 list = g_list_next(list)) {
405 struct btd_adapter *adapter = list->data;
407 if (adapter->is_default)
414 bool btd_adapter_is_default(struct btd_adapter *adapter)
419 return adapter->is_default;
422 uint16_t btd_adapter_get_index(struct btd_adapter *adapter)
425 return MGMT_INDEX_NONE;
427 return adapter->dev_id;
430 static gboolean process_auth_queue(gpointer user_data);
432 static void dev_class_changed_callback(uint16_t index, uint16_t length,
433 const void *param, void *user_data)
435 struct btd_adapter *adapter = user_data;
436 const struct mgmt_cod *rp = param;
439 if (length < sizeof(*rp)) {
440 btd_error(adapter->dev_id,
441 "Wrong size of class of device changed parameters");
445 dev_class = rp->val[0] | (rp->val[1] << 8) | (rp->val[2] << 16);
447 if (dev_class == adapter->dev_class)
450 DBG("Class: 0x%06x", dev_class);
452 adapter->dev_class = dev_class;
454 g_dbus_emit_property_changed(dbus_conn, adapter->path,
455 ADAPTER_INTERFACE, "Class");
458 static void set_dev_class_complete(uint8_t status, uint16_t length,
459 const void *param, void *user_data)
461 struct btd_adapter *adapter = user_data;
463 if (status != MGMT_STATUS_SUCCESS) {
464 btd_error(adapter->dev_id,
465 "Failed to set device class: %s (0x%02x)",
466 mgmt_errstr(status), status);
471 * The parameters are identical and also the task that is
472 * required in both cases. So it is safe to just call the
473 * event handling functions here.
475 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
478 static void set_dev_class(struct btd_adapter *adapter)
480 struct mgmt_cp_set_dev_class cp;
483 * If the controller does not support BR/EDR operation,
484 * there is no point in trying to set a major and minor
487 * This is an optimization for Low Energy only controllers.
489 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
492 memset(&cp, 0, sizeof(cp));
495 * Silly workaround for a really stupid kernel bug :(
497 * All current kernel versions assign the major and minor numbers
498 * straight to dev_class[0] and dev_class[1] without considering
499 * the proper bit shifting.
501 * To make this work, shift the value in userspace for now until
502 * we get a fixed kernel version.
504 cp.major = adapter->major_class & 0x1f;
505 cp.minor = adapter->minor_class << 2;
507 DBG("sending set device class command for index %u", adapter->dev_id);
509 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_CLASS,
510 adapter->dev_id, sizeof(cp), &cp,
511 set_dev_class_complete, adapter, NULL) > 0)
514 btd_error(adapter->dev_id,
515 "Failed to set class of device for index %u", adapter->dev_id);
518 void btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
521 if (adapter->major_class == major && adapter->minor_class == minor)
524 DBG("class: major %u minor %u", major, minor);
526 adapter->major_class = major;
527 adapter->minor_class = minor;
529 set_dev_class(adapter);
532 static uint8_t get_mode(const char *mode)
534 if (strcasecmp("off", mode) == 0)
536 else if (strcasecmp("connectable", mode) == 0)
537 return MODE_CONNECTABLE;
538 else if (strcasecmp("discoverable", mode) == 0)
539 return MODE_DISCOVERABLE;
544 const char *btd_adapter_get_storage_dir(struct btd_adapter *adapter)
548 if (adapter->bdaddr_type == BDADDR_LE_RANDOM) {
549 strcpy(dir, "static-");
550 ba2str(&adapter->bdaddr, dir + 7);
552 ba2str(&adapter->bdaddr, dir);
558 uint8_t btd_adapter_get_address_type(struct btd_adapter *adapter)
560 return adapter->bdaddr_type;
563 static void store_adapter_info(struct btd_adapter *adapter)
566 char filename[PATH_MAX];
569 gboolean discoverable;
571 key_file = g_key_file_new();
573 if (adapter->pairable_timeout != main_opts.pairto)
574 g_key_file_set_integer(key_file, "General", "PairableTimeout",
575 adapter->pairable_timeout);
577 if ((adapter->current_settings & MGMT_SETTING_DISCOVERABLE) &&
578 !adapter->discoverable_timeout)
581 discoverable = FALSE;
583 g_key_file_set_boolean(key_file, "General", "Discoverable",
586 if (adapter->discoverable_timeout != main_opts.discovto)
587 g_key_file_set_integer(key_file, "General",
588 "DiscoverableTimeout",
589 adapter->discoverable_timeout);
591 if (adapter->stored_alias)
592 g_key_file_set_string(key_file, "General", "Alias",
593 adapter->stored_alias);
594 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
595 /* Store A2DP Role */
596 if (adapter->a2dp_role == BLUETOOTH_A2DP_SINK_ROLE)
597 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "sink");
599 g_key_file_set_string(key_file, "General", "DefaultA2DPRole", "source");
602 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
603 btd_adapter_get_storage_dir(adapter));
605 create_file(filename, S_IRUSR | S_IWUSR);
607 str = g_key_file_to_data(key_file, &length, NULL);
608 g_file_set_contents(filename, str, length, NULL);
611 g_key_file_free(key_file);
614 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
615 bluetooth_a2dp_role_t btd_adapter_get_a2dp_role(struct btd_adapter *adapter)
618 return BLUETOOTH_A2DP_SOURCE_ROLE;
620 return adapter->a2dp_role;
623 void btd_adapter_set_a2dp_role(struct btd_adapter *adapter, bluetooth_a2dp_role_t role)
626 DBG("Could not set a2dp role");
630 if (role == BLUETOOTH_A2DP_SOURCE_ROLE) {
631 DBG("Set audio source role");
632 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
633 } else if (role == BLUETOOTH_A2DP_SINK_ROLE) {
634 DBG("Set audio sink role");
635 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
638 store_adapter_info(adapter);
641 void btd_adapter_emit_a2dp_role_changed(struct btd_adapter *adapter)
644 DBG("Could not emit signal for a2dp role");
648 DBG("A2dp role: %u", adapter->a2dp_role);
650 g_dbus_emit_property_changed(dbus_conn, adapter->path,
651 ADAPTER_INTERFACE, "A2dpRole");
655 static void trigger_pairable_timeout(struct btd_adapter *adapter);
656 static void adapter_start(struct btd_adapter *adapter);
657 static void adapter_stop(struct btd_adapter *adapter);
658 static void trigger_passive_scanning(struct btd_adapter *adapter);
659 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
661 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
662 static bool load_local_irk(struct btd_adapter *adapter);
663 static bool set_local_irk(struct btd_adapter *adapter);
664 static bool set_privacy(struct btd_adapter *adapter, bool privacy);
667 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
668 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
669 static gboolean charging_state_timeout_cb(gpointer user_data)
671 struct btd_adapter *adapter = user_data;
672 int bredr_pkt_type = ACL_PTYPE_MASK;
674 adapter->charging_timeout = 0;
676 DBG("Set all connections to BR/EDR type");
677 g_slist_foreach(adapter->devices, device_change_pkt_type,
678 (gpointer)bredr_pkt_type);
683 static void set_charging_state(struct btd_adapter *adapter,
684 charging_state_e state)
686 int br_pkt_type = ACL_PTYPE_MASK |
687 HCI_2DH1 | HCI_2DH3 | HCI_2DH5 |
688 HCI_3DH1 | HCI_3DH3 | HCI_3DH5;
690 if (adapter->charging == state)
693 DBG("old charging state : %d, new charging_state : %d",
694 adapter->charging, state);
697 * Only none / wire charging <-> wireless charging state change should
700 if ((adapter->charging == NONE_CHARGING && state == WIRE_CHARGING) ||
701 (adapter->charging == WIRE_CHARGING && state == NONE_CHARGING)) {
702 DBG("Just update charging state");
703 adapter->charging = state;
707 if (adapter->charging_timeout) {
708 g_source_remove(adapter->charging_timeout);
709 adapter->charging_timeout = 0;
712 adapter->charging = state;
713 if (adapter->charging == NONE_CHARGING ||
714 adapter->charging == WIRE_CHARGING) {
715 DBG("Trigger timeout to set connection to BR/EDR type");
716 adapter->charging_timeout = g_timeout_add(2000,
717 charging_state_timeout_cb, adapter);
718 } else if (adapter->charging == WIRELESS_CHARGING) {
719 DBG("Set all connections to BR type");
720 g_slist_foreach(adapter->devices, device_change_pkt_type,
721 (gpointer)br_pkt_type);
727 static gboolean charging_state_changed(DBusConnection *connection,
728 DBusMessage *msg, void *user_data)
730 struct btd_adapter *adapter = user_data;
733 DBG("charging_state_changed");
735 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &state,
739 set_charging_state(adapter, state);
744 charging_state_e get_charging_state(struct btd_adapter *adapter)
746 DBG("charging_state: %d", adapter->charging);
747 return adapter->charging;
749 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
751 static int compare_slot(gconstpointer a, gconstpointer b)
753 const struct adv_info *adv = a;
754 const int id = *(int*)b;
756 return (adv->slot_id == id ? 0 : -1);
759 static struct adv_info *find_advertiser(struct btd_adapter *adapter,
764 list = g_slist_find_custom(adapter->adv_list, &slot_id,
772 static struct adv_info *create_advertiser(struct btd_adapter *adapter,
775 struct adv_info *adv;
780 adv = find_advertiser(adapter, slot_id);
782 DBG("Aleady existed. solt_id [%d]", slot_id);
786 DBG("Create adv slot id : %d", slot_id);
788 adv = g_new0(struct adv_info, 1);
792 adv->slot_id = slot_id;
794 adapter->adv_list = g_slist_append(adapter->adv_list, adv);
799 static void advertising_state_changed(struct btd_adapter *adapter,
800 int slot_id, bool enabled)
802 struct adv_info *adv;
809 adv = find_advertiser(adapter, slot_id);
811 DBG("Unable to find advertiser [%d]", slot_id);
815 adv->status = enabled;
816 DBG("slot_id %d, status %d", adv->slot_id, adv->status);
818 g_dbus_emit_signal(dbus_conn, adapter->path,
819 ADAPTER_INTERFACE, "AdvertisingEnabled",
820 DBUS_TYPE_INT32, &id,
821 DBUS_TYPE_BOOLEAN, &state,
825 static void clear_advertiser_cb(gpointer data, gpointer user_data)
827 struct adv_info *adv = data;
828 struct btd_adapter *adapter = user_data;
831 advertising_state_changed(adapter, adv->slot_id, 0);
834 static void advertiser_cleanup(struct btd_adapter *adapter)
836 if (!adapter->adv_list)
839 g_slist_foreach(adapter->adv_list, clear_advertiser_cb, adapter);
840 g_slist_free(adapter->adv_list);
841 adapter->adv_list = NULL;
844 static void update_advertiser_address(gpointer data, gpointer user_data)
846 struct adv_info *adv = data;
847 struct btd_adapter *adapter = user_data;
849 if (adv->slot_id > 0 && adv->status == 1)
850 adapter_le_set_random_address(adapter, &adapter->rpa, adv->slot_id);
853 static void rpa_changed_callback(uint16_t index, uint16_t length,
854 const void *param, void *user_data)
856 const struct mgmt_ev_rpa_changed *ev = param;
857 struct btd_adapter *adapter = user_data;
860 if (length < sizeof(*ev)) {
861 error("Too small rpa changed event");
865 ba2str(&ev->bdaddr, addr);
866 DBG("RPA changed %s", addr);
867 bacpy(&adapter->rpa, &ev->bdaddr);
869 if (!adapter->adv_list)
872 g_slist_foreach(adapter->adv_list, update_advertiser_address, adapter);
877 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
878 #define OCF_PAGE_SCAN_TIMEOUT 0x0018
879 #define OGF_PAGE_SCAN_TIMEOUT 0x03
882 uint16_t timeout; /* Value */
883 } __attribute__ ((packed)) hci_page_scan_timeout;
884 #define HCI_PAGE_SCAN_TIMEOUT_CP_SIZE 2
886 static gboolean send_sprd_page_scan_timeout(gint value)
889 hci_page_scan_timeout cp;
891 dd = hci_open_dev(0);
893 if (hci_send_cmd(dd, OGF_PAGE_SCAN_TIMEOUT, OCF_PAGE_SCAN_TIMEOUT,
894 HCI_PAGE_SCAN_TIMEOUT_CP_SIZE, &cp) < 0) {
895 DBG("Error: While setting Page Timeout value");
899 DBG("Page Scan Timeout Value Patch %d", value);
907 static void settings_changed(struct btd_adapter *adapter, uint32_t settings)
909 uint32_t changed_mask;
911 changed_mask = adapter->current_settings ^ settings;
913 adapter->current_settings = settings;
914 adapter->pending_settings &= ~changed_mask;
916 DBG("Changed settings: 0x%08x", changed_mask);
917 DBG("Pending settings: 0x%08x", adapter->pending_settings);
919 if (changed_mask & MGMT_SETTING_POWERED) {
920 g_dbus_emit_property_changed(dbus_conn, adapter->path,
921 ADAPTER_INTERFACE, "Powered");
923 if (adapter->current_settings & MGMT_SETTING_POWERED) {
924 adapter_start(adapter);
926 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
927 if (TIZEN_FEATURE_BLUEZ_SPRD_PAGE_SCAN) {
928 /* Approx 6.4 Seconds of timeout */
929 /* This Added because Z3 device was not able to connect with
930 * some device as it was getting Page Timeout
931 * (LG HBS800, sony carkit) etc. So, Increasing Page timeout value
932 * from 5.12 Sec (which is default) to ~6.4sec*/
933 DBG("Setting value");
934 send_sprd_page_scan_timeout(10240);
938 adapter_stop(adapter);
943 if (!adapter_remaining)
949 if (changed_mask & MGMT_SETTING_LE) {
950 if ((adapter->current_settings & MGMT_SETTING_POWERED) &&
951 (adapter->current_settings & MGMT_SETTING_LE))
952 trigger_passive_scanning(adapter);
955 if (changed_mask & MGMT_SETTING_DISCOVERABLE) {
956 g_dbus_emit_property_changed(dbus_conn, adapter->path,
957 ADAPTER_INTERFACE, "Discoverable");
958 store_adapter_info(adapter);
959 btd_adv_manager_refresh(adapter->adv_manager);
962 if (changed_mask & MGMT_SETTING_BONDABLE) {
963 g_dbus_emit_property_changed(dbus_conn, adapter->path,
964 ADAPTER_INTERFACE, "Pairable");
966 trigger_pairable_timeout(adapter);
969 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
970 if (changed_mask & MGMT_SETTING_ADVERTISING) {
971 if ((adapter->current_settings & MGMT_SETTING_ADVERTISING) &&
972 (adapter->advertising)) {
976 adapter->advertising = adapter->current_settings & MGMT_SETTING_ADVERTISING;
977 advertising_state_changed(adapter, 0, adapter->advertising);
980 if ((changed_mask & MGMT_SETTING_PRIVACY) &&
981 !(adapter->current_settings & MGMT_SETTING_PRIVACY)) {
982 DBG("LE Privacy feature is disabled");
985 * Some Android devices don't consider the device as LE one,
986 * if the device doesn't distribute IRK when pairing.
987 * Because of this compatibility issue, set IRK
988 * even though privacy feature is disabled.
990 set_local_irk(adapter);
995 static void new_settings_callback(uint16_t index, uint16_t length,
996 const void *param, void *user_data)
998 struct btd_adapter *adapter = user_data;
1001 if (length < sizeof(settings)) {
1002 btd_error(adapter->dev_id,
1003 "Wrong size of new settings parameters");
1007 settings = get_le32(param);
1009 if (settings == adapter->current_settings)
1012 DBG("Settings: 0x%08x", settings);
1014 settings_changed(adapter, settings);
1017 static void set_mode_complete(uint8_t status, uint16_t length,
1018 const void *param, void *user_data)
1020 struct btd_adapter *adapter = user_data;
1022 if (status != MGMT_STATUS_SUCCESS) {
1023 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
1024 mgmt_errstr(status), status);
1029 * The parameters are identical and also the task that is
1030 * required in both cases. So it is safe to just call the
1031 * event handling functions here.
1033 new_settings_callback(adapter->dev_id, length, param, adapter);
1036 static bool set_mode(struct btd_adapter *adapter, uint16_t opcode,
1039 struct mgmt_mode cp;
1040 uint32_t setting = 0;
1042 memset(&cp, 0, sizeof(cp));
1046 case MGMT_OP_SET_POWERED:
1047 setting = MGMT_SETTING_POWERED;
1049 case MGMT_OP_SET_CONNECTABLE:
1050 setting = MGMT_SETTING_CONNECTABLE;
1052 case MGMT_OP_SET_FAST_CONNECTABLE:
1053 setting = MGMT_SETTING_FAST_CONNECTABLE;
1055 case MGMT_OP_SET_DISCOVERABLE:
1056 setting = MGMT_SETTING_DISCOVERABLE;
1058 case MGMT_OP_SET_BONDABLE:
1059 setting = MGMT_SETTING_DISCOVERABLE;
1063 adapter->pending_settings |= setting;
1065 DBG("sending set mode command for index %u", adapter->dev_id);
1067 if (mgmt_send(adapter->mgmt, opcode,
1068 adapter->dev_id, sizeof(cp), &cp,
1069 set_mode_complete, adapter, NULL) > 0)
1072 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1078 static bool set_discoverable(struct btd_adapter *adapter, uint8_t mode,
1081 struct mgmt_cp_set_discoverable cp;
1083 memset(&cp, 0, sizeof(cp));
1085 cp.timeout = htobs(timeout);
1087 DBG("sending set mode command for index %u", adapter->dev_id);
1089 if (kernel_conn_control) {
1091 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, mode);
1093 /* This also disables discoverable so we're done */
1094 return set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
1098 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DISCOVERABLE,
1099 adapter->dev_id, sizeof(cp), &cp,
1100 set_mode_complete, adapter, NULL) > 0)
1103 btd_error(adapter->dev_id, "Failed to set mode for index %u",
1109 static gboolean pairable_timeout_handler(gpointer user_data)
1111 struct btd_adapter *adapter = user_data;
1113 adapter->pairable_timeout_id = 0;
1115 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
1120 static void trigger_pairable_timeout(struct btd_adapter *adapter)
1122 if (adapter->pairable_timeout_id > 0) {
1123 g_source_remove(adapter->pairable_timeout_id);
1124 adapter->pairable_timeout_id = 0;
1127 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
1130 if (adapter->pairable_timeout > 0)
1131 adapter->pairable_timeout_id =
1132 g_timeout_add_seconds(adapter->pairable_timeout,
1133 pairable_timeout_handler, adapter);
1136 static void local_name_changed_callback(uint16_t index, uint16_t length,
1137 const void *param, void *user_data)
1139 struct btd_adapter *adapter = user_data;
1140 const struct mgmt_cp_set_local_name *rp = param;
1142 if (length < sizeof(*rp)) {
1143 btd_error(adapter->dev_id,
1144 "Wrong size of local name changed parameters");
1148 if (!g_strcmp0(adapter->short_name, (const char *) rp->short_name) &&
1149 !g_strcmp0(adapter->name, (const char *) rp->name))
1152 DBG("Name: %s", rp->name);
1153 DBG("Short name: %s", rp->short_name);
1155 g_free(adapter->name);
1156 adapter->name = g_strdup((const char *) rp->name);
1158 g_free(adapter->short_name);
1159 adapter->short_name = g_strdup((const char *) rp->short_name);
1162 * Changing the name (even manually via HCI) will update the
1163 * current alias property.
1165 * In case the name is empty, use the short name.
1167 * There is a difference between the stored alias (which is
1168 * configured by the user) and the current alias. The current
1169 * alias is temporary for the lifetime of the daemon.
1171 if (adapter->name && adapter->name[0] != '\0') {
1172 g_free(adapter->current_alias);
1173 adapter->current_alias = g_strdup(adapter->name);
1175 g_free(adapter->current_alias);
1176 adapter->current_alias = g_strdup(adapter->short_name);
1179 DBG("Current alias: %s", adapter->current_alias);
1181 if (!adapter->current_alias)
1184 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1185 ADAPTER_INTERFACE, "Alias");
1187 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
1188 (const uint8_t *) adapter->current_alias,
1189 strlen(adapter->current_alias));
1192 static void set_local_name_complete(uint8_t status, uint16_t length,
1193 const void *param, void *user_data)
1195 struct btd_adapter *adapter = user_data;
1197 if (status != MGMT_STATUS_SUCCESS) {
1198 btd_error(adapter->dev_id,
1199 "Failed to set local name: %s (0x%02x)",
1200 mgmt_errstr(status), status);
1205 * The parameters are identical and also the task that is
1206 * required in both cases. So it is safe to just call the
1207 * event handling functions here.
1209 local_name_changed_callback(adapter->dev_id, length, param, adapter);
1212 static int set_name(struct btd_adapter *adapter, const char *name)
1214 struct mgmt_cp_set_local_name cp;
1215 char maxname[MAX_NAME_LENGTH];
1217 memset(maxname, 0, sizeof(maxname));
1218 strncpy(maxname, name, MAX_NAME_LENGTH - 1);
1220 if (!g_utf8_validate(maxname, -1, NULL)) {
1221 btd_error(adapter->dev_id,
1222 "Name change failed: supplied name isn't valid UTF-8");
1226 memset(&cp, 0, sizeof(cp));
1227 strncpy((char *) cp.name, maxname, sizeof(cp.name) - 1);
1229 DBG("sending set local name command for index %u", adapter->dev_id);
1231 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LOCAL_NAME,
1232 adapter->dev_id, sizeof(cp), &cp,
1233 set_local_name_complete, adapter, NULL) > 0)
1236 btd_error(adapter->dev_id, "Failed to set local name for index %u",
1242 int adapter_set_name(struct btd_adapter *adapter, const char *name)
1244 if (g_strcmp0(adapter->system_name, name) == 0)
1247 DBG("name: %s", name);
1249 g_free(adapter->system_name);
1250 adapter->system_name = g_strdup(name);
1252 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1253 ADAPTER_INTERFACE, "Name");
1255 /* alias is preferred over system name */
1256 if (adapter->stored_alias)
1259 DBG("alias: %s", name);
1261 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1262 ADAPTER_INTERFACE, "Alias");
1264 return set_name(adapter, name);
1267 struct btd_device *btd_adapter_find_device(struct btd_adapter *adapter,
1268 const bdaddr_t *dst,
1269 uint8_t bdaddr_type)
1271 struct device_addr_type addr;
1272 struct btd_device *device;
1278 bacpy(&addr.bdaddr, dst);
1279 addr.bdaddr_type = bdaddr_type;
1281 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1282 list = g_slist_find_custom(adapter->devices, &addr,
1283 device_addr_type_strict_cmp);
1285 device = list->data;
1289 list = g_slist_find_custom(adapter->devices, &addr,
1290 device_addr_type_cmp);
1294 device = list->data;
1297 * If we're looking up based on public address and the address
1298 * was not previously used over this bearer we may need to
1299 * update LE or BR/EDR support information.
1301 if (bdaddr_type == BDADDR_BREDR)
1302 device_set_bredr_support(device);
1304 device_set_le_support(device, bdaddr_type);
1309 static void uuid_to_uuid128(uuid_t *uuid128, const uuid_t *uuid)
1311 if (uuid->type == SDP_UUID16)
1312 sdp_uuid16_to_uuid128(uuid128, uuid);
1313 else if (uuid->type == SDP_UUID32)
1314 sdp_uuid32_to_uuid128(uuid128, uuid);
1316 memcpy(uuid128, uuid, sizeof(*uuid));
1319 static bool is_supported_uuid(const uuid_t *uuid)
1323 /* mgmt versions from 1.3 onwards support all types of UUIDs */
1324 if (MGMT_VERSION(mgmt_version, mgmt_revision) >= MGMT_VERSION(1, 3))
1327 uuid_to_uuid128(&tmp, uuid);
1329 if (!sdp_uuid128_to_uuid(&tmp))
1332 if (tmp.type != SDP_UUID16)
1338 static void add_uuid_complete(uint8_t status, uint16_t length,
1339 const void *param, void *user_data)
1341 struct btd_adapter *adapter = user_data;
1343 if (status != MGMT_STATUS_SUCCESS) {
1344 btd_error(adapter->dev_id, "Failed to add UUID: %s (0x%02x)",
1345 mgmt_errstr(status), status);
1350 * The parameters are identical and also the task that is
1351 * required in both cases. So it is safe to just call the
1352 * event handling functions here.
1354 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1356 if (adapter->initialized)
1357 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1358 ADAPTER_INTERFACE, "UUIDs");
1361 static int add_uuid(struct btd_adapter *adapter, uuid_t *uuid, uint8_t svc_hint)
1363 struct mgmt_cp_add_uuid cp;
1367 if (!is_supported_uuid(uuid)) {
1368 btd_warn(adapter->dev_id,
1369 "Ignoring unsupported UUID for addition");
1373 uuid_to_uuid128(&uuid128, uuid);
1375 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1376 htob128(&uint128, (uint128_t *) cp.uuid);
1377 cp.svc_hint = svc_hint;
1379 DBG("sending add uuid command for index %u", adapter->dev_id);
1381 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_UUID,
1382 adapter->dev_id, sizeof(cp), &cp,
1383 add_uuid_complete, adapter, NULL) > 0)
1386 btd_error(adapter->dev_id, "Failed to add UUID for index %u",
1392 static void remove_uuid_complete(uint8_t status, uint16_t length,
1393 const void *param, void *user_data)
1395 struct btd_adapter *adapter = user_data;
1397 if (status != MGMT_STATUS_SUCCESS) {
1398 btd_error(adapter->dev_id, "Failed to remove UUID: %s (0x%02x)",
1399 mgmt_errstr(status), status);
1404 * The parameters are identical and also the task that is
1405 * required in both cases. So it is safe to just call the
1406 * event handling functions here.
1408 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1410 if (adapter->initialized)
1411 g_dbus_emit_property_changed(dbus_conn, adapter->path,
1412 ADAPTER_INTERFACE, "UUIDs");
1415 static int remove_uuid(struct btd_adapter *adapter, uuid_t *uuid)
1417 struct mgmt_cp_remove_uuid cp;
1421 if (!is_supported_uuid(uuid)) {
1422 btd_warn(adapter->dev_id,
1423 "Ignoring unsupported UUID for removal");
1427 uuid_to_uuid128(&uuid128, uuid);
1429 ntoh128((uint128_t *) uuid128.value.uuid128.data, &uint128);
1430 htob128(&uint128, (uint128_t *) cp.uuid);
1432 DBG("sending remove uuid command for index %u", adapter->dev_id);
1434 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1435 adapter->dev_id, sizeof(cp), &cp,
1436 remove_uuid_complete, adapter, NULL) > 0)
1439 btd_error(adapter->dev_id, "Failed to remove UUID for index %u",
1445 static void clear_uuids_complete(uint8_t status, uint16_t length,
1446 const void *param, void *user_data)
1448 struct btd_adapter *adapter = user_data;
1450 if (status != MGMT_STATUS_SUCCESS) {
1451 btd_error(adapter->dev_id, "Failed to clear UUIDs: %s (0x%02x)",
1452 mgmt_errstr(status), status);
1457 * The parameters are identical and also the task that is
1458 * required in both cases. So it is safe to just call the
1459 * event handling functions here.
1461 dev_class_changed_callback(adapter->dev_id, length, param, adapter);
1464 static int clear_uuids(struct btd_adapter *adapter)
1466 struct mgmt_cp_remove_uuid cp;
1468 memset(&cp, 0, sizeof(cp));
1470 DBG("sending clear uuids command for index %u", adapter->dev_id);
1472 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_UUID,
1473 adapter->dev_id, sizeof(cp), &cp,
1474 clear_uuids_complete, adapter, NULL) > 0)
1477 btd_error(adapter->dev_id, "Failed to clear UUIDs for index %u",
1483 static uint8_t get_uuid_mask(uuid_t *uuid)
1485 if (uuid->type != SDP_UUID16)
1488 switch (uuid->value.uuid16) {
1489 case DIALUP_NET_SVCLASS_ID:
1490 case CIP_SVCLASS_ID:
1491 return 0x42; /* Telephony & Networking */
1492 case IRMC_SYNC_SVCLASS_ID:
1493 case OBEX_OBJPUSH_SVCLASS_ID:
1494 case OBEX_FILETRANS_SVCLASS_ID:
1495 case IRMC_SYNC_CMD_SVCLASS_ID:
1496 case PBAP_PSE_SVCLASS_ID:
1497 return 0x10; /* Object Transfer */
1498 case HEADSET_SVCLASS_ID:
1499 case HANDSFREE_SVCLASS_ID:
1500 return 0x20; /* Audio */
1501 case CORDLESS_TELEPHONY_SVCLASS_ID:
1502 case INTERCOM_SVCLASS_ID:
1503 case FAX_SVCLASS_ID:
1504 case SAP_SVCLASS_ID:
1506 * Setting the telephony bit for the handsfree audio gateway
1507 * role is not required by the HFP specification, but the
1508 * Nokia 616 carkit is just plain broken! It will refuse
1509 * pairing without this bit set.
1511 case HANDSFREE_AGW_SVCLASS_ID:
1512 return 0x40; /* Telephony */
1513 case AUDIO_SOURCE_SVCLASS_ID:
1514 case VIDEO_SOURCE_SVCLASS_ID:
1515 return 0x08; /* Capturing */
1516 case AUDIO_SINK_SVCLASS_ID:
1517 case VIDEO_SINK_SVCLASS_ID:
1518 return 0x04; /* Rendering */
1519 case PANU_SVCLASS_ID:
1520 case NAP_SVCLASS_ID:
1522 return 0x02; /* Networking */
1528 static int uuid_cmp(const void *a, const void *b)
1530 const sdp_record_t *rec = a;
1531 const uuid_t *uuid = b;
1533 return sdp_uuid_cmp(&rec->svclass, uuid);
1536 static void adapter_service_insert(struct btd_adapter *adapter, sdp_record_t *rec)
1538 sdp_list_t *browse_list = NULL;
1542 DBG("%s", adapter->path);
1544 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1546 DBG("record is NULL return");
1551 /* skip record without a browse group */
1552 if (sdp_get_browse_groups(rec, &browse_list) < 0) {
1553 DBG("skipping record without browse group");
1557 sdp_uuid16_create(&browse_uuid, PUBLIC_BROWSE_GROUP);
1559 /* skip record without public browse group */
1560 if (!sdp_list_find(browse_list, &browse_uuid, sdp_uuid_cmp))
1563 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1568 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1572 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1573 add_uuid(adapter, &rec->svclass, svc_hint);
1577 sdp_list_free(browse_list, free);
1580 int adapter_service_add(struct btd_adapter *adapter, sdp_record_t *rec)
1584 DBG("%s", adapter->path);
1586 ret = add_record_to_server(&adapter->bdaddr, rec);
1590 adapter_service_insert(adapter, rec);
1595 void adapter_service_remove(struct btd_adapter *adapter, uint32_t handle)
1597 sdp_record_t *rec = sdp_record_find(handle);
1599 DBG("%s", adapter->path);
1604 adapter->services = sdp_list_remove(adapter->services, rec);
1606 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1607 remove_uuid(adapter, &rec->svclass);
1609 remove_record_from_server(rec->handle);
1612 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1613 static void adapter_print_devices(struct btd_adapter *adapter)
1617 dev = adapter->devices;
1618 for (; dev; dev = dev->next)
1619 device_print_addr(dev->data);
1623 static struct btd_device *adapter_create_device(struct btd_adapter *adapter,
1624 const bdaddr_t *bdaddr,
1625 uint8_t bdaddr_type)
1627 struct btd_device *device;
1629 device = device_create(adapter, bdaddr, bdaddr_type);
1633 adapter->devices = g_slist_append(adapter->devices, device);
1635 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1636 device_print_addr(device);
1637 DBG("devices list count : %d", g_slist_length(adapter->devices));
1643 static void service_auth_cancel(struct service_auth *auth)
1647 if (auth->svc_id > 0)
1648 device_remove_svc_complete_callback(auth->device,
1651 dbus_error_init(&derr);
1652 dbus_set_error_const(&derr, ERROR_INTERFACE ".Canceled", NULL);
1654 auth->cb(&derr, auth->user_data);
1656 dbus_error_free(&derr);
1658 if (auth->agent != NULL) {
1659 agent_cancel(auth->agent);
1660 agent_unref(auth->agent);
1666 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1667 void btd_adapter_unpair_device(struct btd_adapter *adapter,
1668 struct btd_device *dev)
1673 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1675 // adapter->devices = g_slist_remove(adapter->devices, dev);
1677 // adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1680 adapter->connections = g_slist_remove(adapter->connections, dev);
1682 if (adapter->connect_le == dev)
1683 adapter->connect_le = NULL;
1685 l = adapter->auths->head;
1687 struct service_auth *auth = l->data;
1688 GList *next = g_list_next(l);
1690 if (auth->device != dev) {
1695 g_queue_delete_link(adapter->auths, l);
1698 service_auth_cancel(auth);
1701 device_unpair(dev, TRUE);
1706 void btd_adapter_remove_device(struct btd_adapter *adapter,
1707 struct btd_device *dev)
1711 adapter->connect_list = g_slist_remove(adapter->connect_list, dev);
1713 adapter->devices = g_slist_remove(adapter->devices, dev);
1715 adapter->discovery_found = g_slist_remove(adapter->discovery_found,
1718 adapter->connections = g_slist_remove(adapter->connections, dev);
1720 if (adapter->connect_le == dev)
1721 adapter->connect_le = NULL;
1723 l = adapter->auths->head;
1725 struct service_auth *auth = l->data;
1726 GList *next = g_list_next(l);
1728 if (auth->device != dev) {
1733 g_queue_delete_link(adapter->auths, l);
1736 service_auth_cancel(auth);
1739 device_remove(dev, TRUE);
1742 struct btd_device *btd_adapter_get_device(struct btd_adapter *adapter,
1743 const bdaddr_t *addr,
1746 struct btd_device *device;
1751 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1752 if (!bacmp(addr, BDADDR_ANY))
1756 device = btd_adapter_find_device(adapter, addr, addr_type);
1760 return adapter_create_device(adapter, addr, addr_type);
1763 sdp_list_t *btd_adapter_get_services(struct btd_adapter *adapter)
1765 return adapter->services;
1768 static void passive_scanning_complete(uint8_t status, uint16_t length,
1769 const void *param, void *user_data)
1771 struct btd_adapter *adapter = user_data;
1772 const struct mgmt_cp_start_discovery *rp = param;
1774 DBG("status 0x%02x", status);
1776 if (length < sizeof(*rp)) {
1777 btd_error(adapter->dev_id,
1778 "Wrong size of start scanning return parameters");
1782 if (status == MGMT_STATUS_SUCCESS) {
1783 adapter->discovery_type = rp->type;
1784 adapter->discovery_enable = 0x01;
1788 static gboolean passive_scanning_timeout(gpointer user_data)
1790 struct btd_adapter *adapter = user_data;
1791 struct mgmt_cp_start_discovery cp;
1793 adapter->passive_scan_timeout = 0;
1795 cp.type = SCAN_TYPE_LE;
1796 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1797 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
1798 adapter->dev_id, sizeof(cp), &cp,
1799 passive_scanning_complete, adapter, NULL);
1801 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
1802 adapter->dev_id, sizeof(cp), &cp,
1803 passive_scanning_complete, adapter, NULL);
1808 static void trigger_passive_scanning(struct btd_adapter *adapter)
1810 if (!(adapter->current_settings & MGMT_SETTING_LE))
1815 if (adapter->passive_scan_timeout > 0) {
1816 g_source_remove(adapter->passive_scan_timeout);
1817 adapter->passive_scan_timeout = 0;
1821 * When the kernel background scanning is available, there is
1822 * no need to start any discovery. The kernel will keep scanning
1823 * as long as devices are in its auto-connection list.
1825 if (kernel_conn_control)
1829 * If any client is running a discovery right now, then do not
1830 * even try to start passive scanning.
1832 * The discovery procedure is using interleaved scanning and
1833 * thus will discover Low Energy devices as well.
1835 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1836 if (adapter->discovery_list || adapter->le_discovery_list)
1839 if (adapter->discovery_list)
1843 if (adapter->discovery_enable == 0x01)
1847 * In case the discovery is suspended (for example for an ongoing
1848 * pairing attempt), then also do not start passive scanning.
1850 if (adapter->discovery_suspended)
1854 * If the list of connectable Low Energy devices is empty,
1855 * then do not start passive scanning.
1857 if (!adapter->connect_list)
1860 adapter->passive_scan_timeout = g_timeout_add_seconds(CONN_SCAN_TIMEOUT,
1861 passive_scanning_timeout, adapter);
1864 static void stop_passive_scanning_complete(uint8_t status, uint16_t length,
1865 const void *param, void *user_data)
1867 struct btd_adapter *adapter = user_data;
1868 struct btd_device *dev;
1871 DBG("status 0x%02x (%s)", status, mgmt_errstr(status));
1873 dev = adapter->connect_le;
1874 adapter->connect_le = NULL;
1877 * When the kernel background scanning is available, there is
1878 * no need to stop any discovery. The kernel will handle the
1879 * auto-connection by itself.
1881 if (kernel_conn_control)
1885 * MGMT_STATUS_REJECTED may be returned from kernel because the passive
1886 * scan timer had expired in kernel and passive scan was disabled just
1887 * around the time we called stop_passive_scanning().
1889 if (status != MGMT_STATUS_SUCCESS && status != MGMT_STATUS_REJECTED) {
1890 btd_error(adapter->dev_id, "Stopping passive scanning failed: %s",
1891 mgmt_errstr(status));
1895 adapter->discovery_type = 0x00;
1896 adapter->discovery_enable = 0x00;
1899 DBG("Device removed while stopping passive scanning");
1900 trigger_passive_scanning(adapter);
1904 err = device_connect_le(dev);
1906 btd_error(adapter->dev_id, "LE auto connection failed: %s (%d)",
1907 strerror(-err), -err);
1908 trigger_passive_scanning(adapter);
1912 static void stop_passive_scanning(struct btd_adapter *adapter)
1914 struct mgmt_cp_stop_discovery cp;
1915 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1916 struct mgmt_cp_stop_discovery le_cp;
1921 /* If there are any normal discovery clients passive scanning
1922 * wont be running */
1923 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1924 if (adapter->discovery_list || adapter->le_discovery_list)
1927 if (adapter->discovery_list)
1931 if (adapter->discovery_enable == 0x00)
1934 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
1935 if ((adapter->discovery_type & 0x01) > 0) {
1937 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1938 adapter->dev_id, sizeof(cp), &cp,
1939 stop_passive_scanning_complete, adapter, NULL);
1941 if ((adapter->discovery_type & 0x06) > 0) {
1943 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
1944 adapter->dev_id, sizeof(le_cp), &le_cp,
1945 stop_passive_scanning_complete, adapter, NULL);
1948 cp.type = adapter->discovery_type;
1950 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
1951 adapter->dev_id, sizeof(cp), &cp,
1952 stop_passive_scanning_complete, adapter, NULL);
1956 static void cancel_passive_scanning(struct btd_adapter *adapter)
1958 if (!(adapter->current_settings & MGMT_SETTING_LE))
1963 if (adapter->passive_scan_timeout > 0) {
1964 g_source_remove(adapter->passive_scan_timeout);
1965 adapter->passive_scan_timeout = 0;
1969 static uint8_t get_scan_type(struct btd_adapter *adapter)
1973 if (adapter->current_settings & MGMT_SETTING_BREDR)
1974 type = SCAN_TYPE_BREDR;
1978 if (adapter->current_settings & MGMT_SETTING_LE)
1979 type |= SCAN_TYPE_LE;
1984 static void free_discovery_filter(struct discovery_filter *discovery_filter)
1986 if (!discovery_filter)
1989 g_slist_free_full(discovery_filter->uuids, free);
1990 g_free(discovery_filter);
1993 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay);
1995 static void start_discovery_complete(uint8_t status, uint16_t length,
1996 const void *param, void *user_data)
1998 struct btd_adapter *adapter = user_data;
1999 struct watch_client *client;
2000 const struct mgmt_cp_start_discovery *rp = param;
2003 DBG("status 0x%02x", status);
2005 /* Is there are no clients the discovery must have been stopped while
2006 * discovery command was pending.
2008 if (!adapter->discovery_list) {
2009 struct mgmt_cp_stop_discovery cp;
2011 if (status != MGMT_STATUS_SUCCESS)
2014 /* Stop discovering as there are no clients left */
2016 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2017 adapter->dev_id, sizeof(cp), &cp,
2022 client = adapter->discovery_list->data;
2024 if (length < sizeof(*rp)) {
2025 btd_error(adapter->dev_id,
2026 "Wrong size of start discovery return parameters");
2032 if (status == MGMT_STATUS_SUCCESS) {
2033 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2034 DBG("Return param discovery type 0x%02x", rp->type);
2035 adapter->discovery_type |= rp->type;
2037 adapter->discovery_type = rp->type;
2039 adapter->discovery_enable = 0x01;
2041 if (adapter->current_discovery_filter)
2042 adapter->filtered_discovery = true;
2044 adapter->filtered_discovery = false;
2047 g_dbus_send_reply(dbus_conn, client->msg,
2049 dbus_message_unref(client->msg);
2053 if (adapter->discovering)
2056 adapter->discovering = true;
2057 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2058 ADAPTER_INTERFACE, "Discovering");
2060 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2062 adapter->discovering = false;
2063 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2064 ADAPTER_INTERFACE, "Discovering");
2069 /* Reply with an error if the first discovery has failed */
2071 reply = btd_error_busy(client->msg);
2072 g_dbus_send_message(dbus_conn, reply);
2073 g_dbus_remove_watch(dbus_conn, client->watch);
2078 * In case the restart of the discovery failed, then just trigger
2079 * it for the next idle timeout again.
2081 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2082 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT * 2);
2086 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2087 static void start_le_discovery_complete(uint8_t status, uint16_t length,
2088 const void *param, void *user_data)
2090 struct btd_adapter *adapter = user_data;
2091 const struct mgmt_cp_start_discovery *rp = param;
2094 error("Error ocurred in LEDiscovering, rp is NULL");
2098 DBG("status 0x%02x", status);
2099 if (length < sizeof(*rp)) {
2100 error("Wrong size of start discovery return parameters");
2104 DBG("Discovery Type 0x%02x", rp->type);
2105 if (status == MGMT_STATUS_SUCCESS) {
2106 adapter->discovery_type |= rp->type;
2107 adapter->discovery_enable = 0x01;
2109 if (adapter->le_discovering)
2112 adapter->le_discovering = true;
2113 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2114 ADAPTER_INTERFACE, "LEDiscovering");
2118 adapter->le_discovering = false;
2119 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2120 ADAPTER_INTERFACE, "LEDiscovering");
2126 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2127 static gboolean start_le_discovery_timeout(gpointer user_data)
2129 struct btd_adapter *adapter = user_data;
2134 adapter->le_discovery_idle_timeout = 0;
2136 new_type = SCAN_TYPE_LE;
2138 if (adapter->discovery_enable == 0x01) {
2140 * If there is an already running discovery and it has the
2141 * same type, then just keep it.
2144 if ((adapter->discovery_type & new_type) == SCAN_TYPE_LE) {
2145 if (adapter->le_discovering)
2148 adapter->le_discovering = true;
2149 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2150 ADAPTER_INTERFACE, "LEDiscovering");
2156 struct mgmt_cp_start_discovery cp;
2159 mgmt_send(adapter->mgmt, MGMT_OP_START_LE_DISCOVERY,
2160 adapter->dev_id, sizeof(cp), &cp,
2161 start_le_discovery_complete, adapter, NULL);
2167 static gboolean start_discovery_timeout(gpointer user_data)
2169 struct btd_adapter *adapter = user_data;
2170 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2171 struct mgmt_cp_start_service_discovery *sd_cp;
2177 adapter->discovery_idle_timeout = 0;
2179 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2180 new_type = SCAN_TYPE_BREDR;
2182 if (adapter->discovery_enable == 0x01) {
2184 * If there is an already running discovery and it has the
2185 * same type, then just keep it.
2187 if ((adapter->discovery_type & new_type) == SCAN_TYPE_BREDR) {
2188 if (adapter->discovering)
2191 adapter->discovering = true;
2192 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2193 ADAPTER_INTERFACE, "Discovering");
2199 struct mgmt_cp_start_discovery cp;
2201 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2202 adapter->dev_id, sizeof(cp), &cp,
2203 start_discovery_complete, adapter, NULL);
2206 /* If we're doing filtered discovery, it must be quickly restarted */
2207 adapter->no_scan_restart_delay = !!adapter->current_discovery_filter;
2209 DBG("adapter->current_discovery_filter == %d",
2210 !!adapter->current_discovery_filter);
2212 new_type = get_scan_type(adapter);
2214 if (adapter->discovery_enable == 0x01) {
2215 struct mgmt_cp_stop_discovery cp;
2218 * If we're asked to start regular discovery, and there is an
2219 * already running regular discovery and it has the same type,
2220 * then just keep it.
2222 if (!adapter->current_discovery_filter &&
2223 !adapter->filtered_discovery &&
2224 adapter->discovery_type == new_type) {
2225 if (adapter->discovering)
2228 adapter->discovering = true;
2229 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2230 ADAPTER_INTERFACE, "Discovering");
2235 * Otherwise the current discovery must be stopped. So
2236 * queue up a stop discovery command.
2238 * This can happen if a passive scanning for Low Energy
2239 * devices is ongoing, or scan type is changed between
2240 * regular and filtered, or filter was updated.
2242 cp.type = adapter->discovery_type;
2243 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2244 adapter->dev_id, sizeof(cp), &cp,
2247 /* Don't even bother to try to quickly start discovery
2248 * just after stopping it, it would fail with status
2249 * MGMT_BUSY. Instead discovering_callback will take
2256 /* Regular discovery is required */
2257 if (!adapter->current_discovery_filter) {
2258 struct mgmt_cp_start_discovery cp;
2261 mgmt_send(adapter->mgmt, MGMT_OP_START_DISCOVERY,
2262 adapter->dev_id, sizeof(cp), &cp,
2263 start_discovery_complete, adapter, NULL);
2267 /* Filtered discovery is required */
2268 sd_cp = adapter->current_discovery_filter;
2270 DBG("sending MGMT_OP_START_SERVICE_DISCOVERY %d, %d, %d",
2271 sd_cp->rssi, sd_cp->type,
2272 btohs(sd_cp->uuid_count));
2274 mgmt_send(adapter->mgmt, MGMT_OP_START_SERVICE_DISCOVERY,
2275 adapter->dev_id, sizeof(*sd_cp) +
2276 btohs(sd_cp->uuid_count) * 16,
2277 sd_cp, start_discovery_complete, adapter, NULL);
2284 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2285 static void trigger_start_le_discovery(struct btd_adapter *adapter, guint delay)
2290 cancel_passive_scanning(adapter);
2292 if (adapter->le_discovery_idle_timeout > 0) {
2293 g_source_remove(adapter->le_discovery_idle_timeout);
2294 adapter->le_discovery_idle_timeout = 0;
2298 * If the controller got powered down in between, then ensure
2299 * that we do not keep trying to restart discovery.
2301 * This is safe-guard and should actually never trigger.
2303 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2306 adapter->le_discovery_idle_timeout = g_timeout_add_seconds(delay,
2307 start_le_discovery_timeout, adapter);
2311 static void trigger_start_discovery(struct btd_adapter *adapter, guint delay)
2316 cancel_passive_scanning(adapter);
2318 if (adapter->discovery_idle_timeout > 0) {
2319 g_source_remove(adapter->discovery_idle_timeout);
2320 adapter->discovery_idle_timeout = 0;
2324 * If the controller got powered down in between, then ensure
2325 * that we do not keep trying to restart discovery.
2327 * This is safe-guard and should actually never trigger.
2329 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
2332 adapter->discovery_idle_timeout = g_timeout_add_seconds(delay,
2333 start_discovery_timeout, adapter);
2336 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
2337 static void suspend_discovery_complete(uint8_t status, uint16_t length,
2338 const void *param, void *user_data)
2340 struct btd_adapter *adapter = user_data;
2342 DBG("status 0x%02x", status);
2344 if (status == MGMT_STATUS_SUCCESS) {
2345 adapter->discovery_type = 0x00;
2346 adapter->discovery_enable = 0x00;
2351 static void suspend_discovery(struct btd_adapter *adapter)
2353 struct mgmt_cp_stop_discovery cp;
2357 adapter->discovery_suspended = true;
2360 * If there are no clients discovering right now, then there is
2361 * also nothing to suspend.
2363 if (!adapter->discovery_list)
2367 * In case of being inside the idle phase, make sure to remove
2368 * the timeout to not trigger a restart.
2370 * The restart will be triggered when the discovery is resumed.
2372 if (adapter->discovery_idle_timeout > 0) {
2373 g_source_remove(adapter->discovery_idle_timeout);
2374 adapter->discovery_idle_timeout = 0;
2377 if (adapter->discovery_enable == 0x00)
2380 cp.type = adapter->discovery_type;
2382 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
2383 adapter->dev_id, sizeof(cp), &cp,
2384 suspend_discovery_complete, adapter, NULL);
2387 static void resume_discovery(struct btd_adapter *adapter)
2391 adapter->discovery_suspended = false;
2394 * If there are no clients discovering right now, then there is
2395 * also nothing to resume.
2397 if (!adapter->discovery_list)
2401 * Treat a suspended discovery session the same as extra long
2402 * idle time for a normal discovery. So just trigger the default
2403 * restart procedure.
2405 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2409 static void discovering_callback(uint16_t index, uint16_t length,
2410 const void *param, void *user_data)
2412 const struct mgmt_ev_discovering *ev = param;
2413 struct btd_adapter *adapter = user_data;
2415 if (length < sizeof(*ev)) {
2416 btd_error(adapter->dev_id, "Too small discovering event");
2420 DBG("hci%u type %u discovering %u method %d", adapter->dev_id, ev->type,
2421 ev->discovering, adapter->filtered_discovery);
2423 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2424 DBG("info discov_type %d", adapter->discovery_type);
2425 if (ev->type == SCAN_TYPE_BREDR) {
2426 if (ev->discovering == FALSE) {
2427 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
2428 adapter->discovering = false;
2430 hci_set_bit(BDADDR_BREDR, &adapter->discovery_type);
2431 adapter->discovering = true;
2433 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2434 ADAPTER_INTERFACE, "Discovering");
2436 } else if (ev->type == SCAN_TYPE_LE) {
2437 if (ev->discovering == FALSE) {
2438 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2439 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2441 if (adapter->le_discovering == true) {
2442 struct watch_client *client;
2443 client = adapter->le_discovery_list->data;
2444 adapter->le_discovering = false;
2445 g_dbus_remove_watch(dbus_conn, client->watch);
2448 hci_set_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
2449 hci_set_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
2450 adapter->le_discovering = true;
2453 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2454 ADAPTER_INTERFACE, "LEDiscovering");
2457 if (adapter->discovery_enable == ev->discovering)
2460 adapter->discovery_type = ev->type;
2461 adapter->discovery_enable = ev->discovering;
2465 * Check for existing discoveries triggered by client applications
2466 * and ignore all others.
2468 * If there are no clients, then it is good idea to trigger a
2469 * passive scanning attempt.
2471 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2472 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2473 if (!adapter->connect_le)
2474 trigger_passive_scanning(adapter);
2478 if (!adapter->discovery_list) {
2479 if (!adapter->connect_le)
2480 trigger_passive_scanning(adapter);
2485 if (adapter->discovery_suspended)
2488 switch (adapter->discovery_enable) {
2490 if (adapter->no_scan_restart_delay)
2491 trigger_start_discovery(adapter, 0);
2493 trigger_start_discovery(adapter, IDLE_DISCOV_TIMEOUT);
2497 if (adapter->discovery_idle_timeout > 0) {
2498 g_source_remove(adapter->discovery_idle_timeout);
2499 adapter->discovery_idle_timeout = 0;
2506 static void invalidate_rssi_and_tx_power(gpointer a)
2508 struct btd_device *dev = a;
2510 device_set_rssi(dev, 0);
2511 device_set_tx_power(dev, 127);
2514 static gboolean remove_temp_devices(gpointer user_data)
2516 struct btd_adapter *adapter = user_data;
2519 DBG("%s", adapter->path);
2521 adapter->temp_devices_timeout = 0;
2523 for (l = adapter->devices; l != NULL; l = next) {
2524 struct btd_device *dev = l->data;
2526 next = g_slist_next(l);
2528 if (device_is_temporary(dev) && !btd_device_is_connected(dev))
2529 btd_adapter_remove_device(adapter, dev);
2535 static void discovery_cleanup(struct btd_adapter *adapter)
2539 adapter->discovery_type = 0x00;
2541 if (adapter->discovery_idle_timeout > 0) {
2542 g_source_remove(adapter->discovery_idle_timeout);
2543 adapter->discovery_idle_timeout = 0;
2546 if (adapter->temp_devices_timeout > 0) {
2547 g_source_remove(adapter->temp_devices_timeout);
2548 adapter->temp_devices_timeout = 0;
2551 g_slist_free_full(adapter->discovery_found,
2552 invalidate_rssi_and_tx_power);
2553 adapter->discovery_found = NULL;
2555 if (!adapter->devices)
2558 for (l = adapter->devices; l != NULL; l = next) {
2559 struct btd_device *dev = l->data;
2561 next = g_slist_next(l);
2563 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2564 if (device_is_temporary(dev) && !device_is_connectable(dev)
2565 && !btd_device_is_connected(dev))
2567 if (device_is_temporary(dev) && !device_is_connectable(dev))
2569 btd_adapter_remove_device(adapter, dev);
2572 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
2573 remove_temp_devices, adapter);
2576 static void discovery_free(void *user_data)
2578 struct watch_client *client = user_data;
2581 g_dbus_remove_watch(dbus_conn, client->watch);
2583 if (client->discovery_filter) {
2584 free_discovery_filter(client->discovery_filter);
2585 client->discovery_filter = NULL;
2589 dbus_message_unref(client->msg);
2591 g_free(client->owner);
2595 static bool set_discovery_discoverable(struct btd_adapter *adapter, bool enable)
2597 if (adapter->discovery_discoverable == enable)
2600 /* Reset discoverable filter if already set */
2601 if (enable && (adapter->current_settings & MGMT_OP_SET_DISCOVERABLE))
2604 adapter->discovery_discoverable = enable;
2606 return set_discoverable(adapter, enable, 0);
2609 static void discovery_remove(struct watch_client *client, bool exit)
2611 struct btd_adapter *adapter = client->adapter;
2613 DBG("owner %s", client->owner);
2615 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
2618 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
2621 if (!exit && client->discovery_filter)
2622 adapter->set_filter_list = g_slist_prepend(
2623 adapter->set_filter_list, client);
2625 discovery_free(client);
2628 * If there are other client discoveries in progress, then leave
2629 * it active. If not, then make sure to stop the restart timeout.
2631 if (adapter->discovery_list)
2634 discovery_cleanup(adapter);
2637 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
2638 static void stop_discovery_complete(uint8_t status, uint16_t length,
2639 const void *param, void *user_data)
2641 struct watch_client *client = user_data;
2642 struct btd_adapter *adapter = client->adapter;
2645 DBG("status 0x%02x", status);
2647 if (status != MGMT_STATUS_SUCCESS) {
2649 reply = btd_error_busy(client->msg);
2650 g_dbus_send_message(dbus_conn, reply);
2657 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2658 g_dbus_send_message(dbus_conn, reply);
2661 adapter->discovery_type &= (~0x01);
2662 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2664 adapter->filtered_discovery = false;
2665 adapter->no_scan_restart_delay = false;
2666 adapter->discovering = false;
2667 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2668 ADAPTER_INTERFACE, "Discovering");
2670 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2671 adapter->discovery_enable = 0x00;
2672 trigger_passive_scanning(adapter);
2676 discovery_remove(client, false);
2679 static void stop_le_discovery_complete(uint8_t status, uint16_t length,
2680 const void *param, void *user_data)
2682 struct watch_client *client = user_data;
2683 struct btd_adapter *adapter = client->adapter;
2686 DBG("status 0x%02x", status);
2688 if (status != MGMT_STATUS_SUCCESS) {
2690 reply = btd_error_busy(client->msg);
2691 g_dbus_send_message(dbus_conn, reply);
2698 reply = g_dbus_create_reply(client->msg, DBUS_TYPE_INVALID);
2699 g_dbus_send_message(dbus_conn, reply);
2702 adapter->discovery_type &= (~0x06);
2703 DBG("Discovery Type 0x%02x", adapter->discovery_type);
2705 adapter->filtered_discovery = false;
2706 adapter->no_scan_restart_delay = false;
2707 adapter->le_discovering = false;
2708 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2709 ADAPTER_INTERFACE, "LEDiscovering");
2711 if (adapter->discovery_list == NULL && adapter->le_discovery_list == NULL) {
2712 adapter->discovery_enable = 0x00;
2713 trigger_passive_scanning(adapter);
2718 * The destroy function will cleanup the client information and
2719 * also remove it from the list of discovery clients.
2721 g_dbus_remove_watch(dbus_conn, client->watch);
2725 static void stop_discovery_complete(uint8_t status, uint16_t length,
2726 const void *param, void *user_data)
2728 struct watch_client *client = user_data;
2729 struct btd_adapter *adapter = client->adapter;
2732 DBG("status 0x%02x", status);
2734 if (status != MGMT_STATUS_SUCCESS) {
2736 reply = btd_error_busy(client->msg);
2737 g_dbus_send_message(dbus_conn, reply);
2743 g_dbus_send_reply(dbus_conn, client->msg, DBUS_TYPE_INVALID);
2744 dbus_message_unref(client->msg);
2748 adapter->discovery_type = 0x00;
2749 adapter->discovery_enable = 0x00;
2750 adapter->filtered_discovery = false;
2751 adapter->no_scan_restart_delay = false;
2752 adapter->discovering = false;
2753 g_dbus_emit_property_changed(dbus_conn, adapter->path,
2754 ADAPTER_INTERFACE, "Discovering");
2756 trigger_passive_scanning(adapter);
2759 discovery_remove(client);
2763 static int compare_sender(gconstpointer a, gconstpointer b)
2765 const struct watch_client *client = a;
2766 const char *sender = b;
2768 return g_strcmp0(client->owner, sender);
2771 static gint g_strcmp(gconstpointer a, gconstpointer b)
2773 return strcmp(a, b);
2776 static void extract_unique_uuids(gpointer data, gpointer user_data)
2778 char *uuid_str = data;
2779 GSList **uuids = user_data;
2781 if (!g_slist_find_custom(*uuids, uuid_str, g_strcmp))
2782 *uuids = g_slist_insert_sorted(*uuids, uuid_str, g_strcmp);
2786 * This method merges all adapter filters into rssi, transport and uuids.
2787 * Returns 1 if there was no filtered scan, 0 otherwise.
2789 static int merge_discovery_filters(struct btd_adapter *adapter, int *rssi,
2790 uint8_t *transport, GSList **uuids)
2793 bool empty_uuid = false;
2794 bool has_regular_discovery = false;
2795 bool has_filtered_discovery = false;
2797 for (l = adapter->discovery_list; l != NULL; l = g_slist_next(l)) {
2798 struct watch_client *client = l->data;
2799 struct discovery_filter *item = client->discovery_filter;
2802 has_regular_discovery = true;
2806 has_filtered_discovery = true;
2808 *transport |= item->type;
2811 * Rule for merging rssi and pathloss into rssi field of kernel
2812 * filter is as follow:
2813 * - if there's any client without proximity filter, then do no
2814 * proximity filtering,
2815 * - if all clients specified RSSI, then use lowest value,
2816 * - if any client specified pathloss, then kernel filter should
2817 * do no proximity, as kernel can't compute pathloss. We'll do
2818 * filtering on our own.
2820 if (item->rssi == DISTANCE_VAL_INVALID)
2821 *rssi = HCI_RSSI_INVALID;
2822 else if (*rssi != HCI_RSSI_INVALID && *rssi >= item->rssi)
2824 else if (item->pathloss != DISTANCE_VAL_INVALID)
2825 *rssi = HCI_RSSI_INVALID;
2827 if (!g_slist_length(item->uuids))
2830 g_slist_foreach(item->uuids, extract_unique_uuids, uuids);
2833 /* If no proximity filtering is set, disable it */
2834 if (*rssi == DISTANCE_VAL_INVALID)
2835 *rssi = HCI_RSSI_INVALID;
2838 * Empty_uuid variable determines wether there was any filter with no
2839 * uuids. In this case someone might be looking for all devices in
2840 * certain proximity, and we need to have empty uuids in kernel filter.
2843 g_slist_free(*uuids);
2847 if (has_regular_discovery) {
2848 if (!has_filtered_discovery)
2852 * It there is both regular and filtered scan running, then
2853 * clear whole fitler to report all devices.
2855 *transport = get_scan_type(adapter);
2856 *rssi = HCI_RSSI_INVALID;
2857 g_slist_free(*uuids);
2864 static void populate_mgmt_filter_uuids(uint8_t (*mgmt_uuids)[16], GSList *uuids)
2868 for (l = uuids; l != NULL; l = g_slist_next(l)) {
2869 bt_uuid_t uuid, u128;
2872 bt_string_to_uuid(&uuid, l->data);
2873 bt_uuid_to_uuid128(&uuid, &u128);
2875 ntoh128((uint128_t *) u128.value.u128.data, &uint128);
2876 htob128(&uint128, (uint128_t *) mgmt_uuids);
2883 * This method merges all adapter filters into one that will be send to kernel.
2884 * cp_ptr is set to null when regular non-filtered discovery is needed,
2885 * otherwise it's pointing to filter. Returns 0 on succes, -1 on error
2887 static int discovery_filter_to_mgmt_cp(struct btd_adapter *adapter,
2888 struct mgmt_cp_start_service_discovery **cp_ptr)
2890 GSList *uuids = NULL;
2891 struct mgmt_cp_start_service_discovery *cp;
2892 int rssi = DISTANCE_VAL_INVALID;
2894 uint8_t discovery_type = 0;
2898 if (merge_discovery_filters(adapter, &rssi, &discovery_type, &uuids)) {
2899 /* There are only regular scans, run just regular scan. */
2904 uuid_count = g_slist_length(uuids);
2906 cp = g_try_malloc(sizeof(*cp) + 16*uuid_count);
2909 g_slist_free(uuids);
2913 cp->type = discovery_type;
2915 cp->uuid_count = htobs(uuid_count);
2916 populate_mgmt_filter_uuids(cp->uuids, uuids);
2918 g_slist_free(uuids);
2922 static bool filters_equal(struct mgmt_cp_start_service_discovery *a,
2923 struct mgmt_cp_start_service_discovery *b) {
2927 if ((!a && b) || (a && !b))
2930 if (a->type != b->type)
2933 if (a->rssi != b->rssi)
2937 * When we create mgmt_cp_start_service_discovery structure inside
2938 * discovery_filter_to_mgmt_cp, we always keep uuids sorted, and
2939 * unique, so we're safe to compare uuid_count, and uuids like that.
2941 if (a->uuid_count != b->uuid_count)
2944 if (memcmp(a->uuids, b->uuids, 16 * a->uuid_count) != 0)
2950 static int update_discovery_filter(struct btd_adapter *adapter)
2952 struct mgmt_cp_start_service_discovery *sd_cp;
2958 if (discovery_filter_to_mgmt_cp(adapter, &sd_cp)) {
2959 btd_error(adapter->dev_id,
2960 "discovery_filter_to_mgmt_cp returned error");
2964 for (l = adapter->discovery_list; l; l = g_slist_next(l)) {
2965 struct watch_client *client = l->data;
2967 if (!client->discovery_filter)
2970 if (client->discovery_filter->discoverable)
2974 set_discovery_discoverable(adapter, l ? true : false);
2977 * If filters are equal, then don't update scan, except for when
2978 * starting discovery.
2980 if (filters_equal(adapter->current_discovery_filter, sd_cp) &&
2981 adapter->discovering != 0) {
2982 DBG("filters were equal, deciding to not restart the scan.");
2987 g_free(adapter->current_discovery_filter);
2988 adapter->current_discovery_filter = sd_cp;
2990 trigger_start_discovery(adapter, 0);
2992 return -EINPROGRESS;
2995 static int discovery_stop(struct watch_client *client, bool exit)
2997 struct btd_adapter *adapter = client->adapter;
2998 struct mgmt_cp_stop_discovery cp;
3000 /* Check if there are more client discovering */
3001 if (g_slist_next(adapter->discovery_list)) {
3002 discovery_remove(client, exit);
3003 update_discovery_filter(adapter);
3007 if (adapter->discovery_discoverable)
3008 set_discovery_discoverable(adapter, false);
3011 * In the idle phase of a discovery, there is no need to stop it
3012 * and so it is enough to send out the signal and just return.
3014 if (adapter->discovery_enable == 0x00) {
3015 discovery_remove(client, exit);
3016 adapter->discovering = false;
3017 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3018 ADAPTER_INTERFACE, "Discovering");
3020 trigger_passive_scanning(adapter);
3024 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3025 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
3027 cp.type = adapter->discovery_type;
3029 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3032 mgmt_send(adapter->mgmt, MGMT_OP_STOP_DISCOVERY,
3033 adapter->dev_id, sizeof(cp), &cp,
3034 stop_discovery_complete, client, NULL);
3036 return -EINPROGRESS;
3039 static void discovery_destroy(void *user_data)
3041 struct watch_client *client = user_data;
3042 struct btd_adapter *adapter = client->adapter;
3044 DBG("owner %s", client->owner);
3046 adapter->set_filter_list = g_slist_remove(adapter->set_filter_list,
3049 adapter->discovery_list = g_slist_remove(adapter->discovery_list,
3052 if (client->discovery_filter) {
3053 free_discovery_filter(client->discovery_filter);
3054 client->discovery_filter = NULL;
3057 g_free(client->owner);
3061 * If there are other client discoveries in progress, then leave
3062 * it active. If not, then make sure to stop the restart timeout.
3064 if (adapter->discovery_list)
3067 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3068 hci_clear_bit(BDADDR_BREDR, &adapter->discovery_type);
3070 adapter->discovery_type = 0x00;
3073 if (adapter->discovery_idle_timeout > 0) {
3074 g_source_remove(adapter->discovery_idle_timeout);
3075 adapter->discovery_idle_timeout = 0;
3078 if (adapter->temp_devices_timeout > 0) {
3079 g_source_remove(adapter->temp_devices_timeout);
3080 adapter->temp_devices_timeout = 0;
3083 discovery_cleanup(adapter);
3085 adapter->temp_devices_timeout = g_timeout_add_seconds(TEMP_DEV_TIMEOUT,
3086 remove_temp_devices, adapter);
3089 static void discovery_disconnect(DBusConnection *conn, void *user_data)
3091 struct watch_client *client = user_data;
3093 DBG("owner %s", client->owner);
3095 discovery_stop(client, true);
3099 * Returns true if client was already discovering, false otherwise. *client
3100 * will point to discovering client, or client that have pre-set his filter.
3102 static bool get_discovery_client(struct btd_adapter *adapter,
3104 struct watch_client **client)
3106 GSList *list = g_slist_find_custom(adapter->discovery_list, owner,
3109 *client = list->data;
3113 list = g_slist_find_custom(adapter->set_filter_list, owner,
3116 *client = list->data;
3124 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
3125 static void le_discovery_destroy(void *user_data)
3127 struct watch_client *client = user_data;
3128 struct btd_adapter *adapter = client->adapter;
3130 DBG("owner %s", client->owner);
3132 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3135 g_free(client->owner);
3139 * If there are other client discoveries in progress, then leave
3140 * it active. If not, then make sure to stop the restart timeout.
3142 DBG("adapter->discovery_list[%p] adapter->le_discovery_list[%p]",
3143 adapter->discovery_list, adapter->le_discovery_list);
3144 if (adapter->discovery_list || adapter->le_discovery_list)
3147 hci_clear_bit(BDADDR_LE_PUBLIC, &adapter->discovery_type);
3148 hci_clear_bit(BDADDR_LE_RANDOM, &adapter->discovery_type);
3150 DBG("Restart Timer... adapter->discovery_type[%d]", adapter->discovery_type);
3151 if (adapter->discovery_idle_timeout > 0) {
3152 g_source_remove(adapter->discovery_idle_timeout);
3153 adapter->discovery_idle_timeout = 0;
3156 if (adapter->temp_devices_timeout > 0) {
3157 g_source_remove(adapter->temp_devices_timeout);
3158 adapter->temp_devices_timeout = 0;
3161 discovery_cleanup(adapter);
3164 static void le_discovery_disconnect(DBusConnection *conn, void *user_data)
3166 struct watch_client *client = user_data;
3167 struct btd_adapter *adapter = client->adapter;
3168 struct mgmt_cp_stop_le_discovery cp;
3170 DBG("owner %s", client->owner);
3172 adapter->le_discovery_list = g_slist_remove(adapter->le_discovery_list,
3176 * There is no need for extra cleanup of the client since that
3177 * will be done by the destroy callback.
3179 * However in case this is the last client, the discovery in
3180 * the kernel needs to be disabled.
3182 if (adapter->le_discovery_list)
3186 * In the idle phase of a discovery, there is no need to stop it
3187 * and so it is enough to send out the signal and just return.
3189 if (adapter->discovery_enable == 0x00) {
3190 adapter->le_discovering = false;
3191 g_dbus_emit_property_changed(dbus_conn, adapter->path,
3192 ADAPTER_INTERFACE, "LEDiscovering");
3194 if (adapter->discovering == false && adapter->le_discovering == false) {
3195 trigger_passive_scanning(adapter);
3202 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
3203 adapter->dev_id, sizeof(cp), &cp,
3204 stop_discovery_complete, client, NULL);
3207 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
3208 static void addr_filter_params_free(gpointer data)
3210 adapter_le_address_filter_params_t *params = data;
3215 static void uuid_filter_params_free(gpointer data)
3217 adapter_le_uuid_params_t *params = data;
3219 g_free((char *)params->uuid);
3220 g_free((char *)params->uuid_mask);
3224 static void manufacturer_filter_params_free(gpointer data)
3226 adapter_le_manf_data_params_t *params = data;
3228 g_free((char *)params->man_data);
3229 g_free((char *)params->man_data_mask);
3233 static void local_name_filter_params_free(gpointer data)
3235 adapter_le_local_name_params_t *params = data;
3237 g_free((char *)params->local_name);
3241 static void service_data_filter_params_free(gpointer data)
3243 adapter_le_service_data_params_t *params = data;
3245 g_free((char *)params->service_data);
3246 g_free((char *)params->service_data_mask);
3250 static void scan_filter_params_free(gpointer data)
3252 adapter_le_scan_filter_param_t *params = data;
3256 int adapter_le_address_cmp(gconstpointer a, gconstpointer b)
3258 const adapter_le_address_filter_params_t *params = a;
3259 const char *address = b;
3262 ba2str(¶ms->broadcaster_addr, addr);
3263 return strcasecmp(addr, address);
3266 int adapter_le_uuid_cmp(gconstpointer a, gconstpointer b)
3268 const adapter_le_uuid_params_t *params = a;
3269 const char *uuid = b;
3271 return strcasecmp((const char *)params->uuid, uuid);
3274 int adapter_le_manufacturer_data_cmp(gconstpointer a, gconstpointer b)
3276 const adapter_le_manf_data_params_t *params = a;
3277 const struct eir_msd *msd = b;
3279 if (msd->company == params->company_id) {
3280 /* if the advertisiement packet is an iBeacon */
3281 if (msd->company == COMPANY_ID_APPLE)
3283 return strncasecmp((const char *)params->man_data,
3284 (const char *)msd->data,
3285 params->man_data_len);
3291 int adapter_le_local_name_cmp(gconstpointer a, gconstpointer b)
3293 const adapter_le_local_name_params_t *params = a;
3294 const char *name = b;
3296 return strcasecmp(params->local_name, name);
3299 int adapter_le_service_data_cmp(gconstpointer a, gconstpointer b)
3301 const adapter_le_service_data_params_t *params = a;
3302 const struct eir_sd *sd = b;
3303 /* Todo, the service data format for 16 bit, 32bit and
3304 * 128 bit uuids needs to addressed */
3305 return strncasecmp((const char *)(params->service_data),
3306 (const char *)sd->data,
3310 int adapter_le_address_filter_index_cmp(gconstpointer a, gconstpointer b)
3312 const adapter_le_address_filter_params_t *params = a;
3313 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3315 return params->filter_index - filter_inex;
3318 int adapter_le_uuid_filter_index_cmp(gconstpointer a, gconstpointer b)
3320 const adapter_le_uuid_params_t *params = a;
3321 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3323 return params->filter_index - filter_inex;
3326 int adapter_le_manufacturer_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3328 const adapter_le_manf_data_params_t *params = a;
3329 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3331 return params->filter_index - filter_inex;
3334 int adapter_le_local_name_filter_index_cmp(gconstpointer a, gconstpointer b)
3336 const adapter_le_local_name_params_t *params = a;
3337 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3339 return params->filter_index - filter_inex;
3342 int adapter_le_service_data_filter_index_cmp(gconstpointer a, gconstpointer b)
3344 const adapter_le_service_data_params_t *params = a;
3345 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3347 return params->filter_index - filter_inex;
3350 int adapter_le_scan_params_filter_index_cmp(gconstpointer a, gconstpointer b)
3352 const adapter_le_scan_filter_param_t *params = a;
3353 uint16_t filter_inex = GPOINTER_TO_UINT(b);
3355 return params->index - filter_inex;
3358 static gboolean adapter_le_clear_platform_scan_filter_data(
3359 struct btd_adapter *adapter, int filter_index)
3366 list = g_slist_find_custom(adapter->addr_filters,
3367 GINT_TO_POINTER(filter_index), adapter_le_address_filter_index_cmp);
3368 if (list && list->data) {
3369 /* Delete info from the struct to list */
3370 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3372 list = g_slist_find_custom(adapter->service_data_changed_filters,
3373 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3374 if (list && list->data) {
3375 /* Delete info from the struct to list */
3376 adapter->service_data_changed_filters = g_slist_delete_link(adapter->service_data_changed_filters, list);
3379 list = g_slist_find_custom(adapter->service_uuid_filters,
3380 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3381 if (list && list->data) {
3382 /* Delete info from the struct to list */
3383 adapter->service_uuid_filters = g_slist_delete_link(adapter->service_uuid_filters, list);
3386 list = g_slist_find_custom(adapter->solicit_data_filters,
3387 GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3388 if (list && list->data) {
3389 /* Delete info from the struct to list */
3390 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3393 list = g_slist_find_custom(adapter->local_name_filters,
3394 GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3395 if (list && list->data) {
3396 /* Delete info from the struct to list */
3397 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3400 list = g_slist_find_custom(adapter->manufaturer_data_filters,
3401 GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3402 if (list && list->data) {
3403 /* Delete info from the struct to list */
3404 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3407 list = g_slist_find_custom(adapter->service_data_filters,
3408 GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3409 if (list && list->data) {
3410 /* Delete info from the struct to list */
3411 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3414 list = g_slist_find_custom(adapter->scan_params,
3415 GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3416 if (list && list->data) {
3417 /* Delete info from the struct to list */
3418 adapter->scan_params = g_slist_delete_link(adapter->scan_params, list);
3424 static gboolean adapter_le_enable_platform_scan_filtering(
3425 struct btd_adapter *adapter, gboolean enable)
3430 DBG("Platform scan filtering enable[%d]", enable);
3432 adapter->scan_filter_support = enable;
3438 static gboolean adapter_le_service_add_addr_scan_filter_data(struct btd_adapter *adapter,
3439 int filter_index, gchar *string, int addr_type)
3441 /* TYPE_DEVICE_ADDRESS */
3442 adapter_le_address_filter_params_t *params;
3446 params = g_new0(adapter_le_address_filter_params_t, 1);
3450 params->filter_index = filter_index;
3451 str2ba(string, ¶ms->broadcaster_addr);
3452 params->bdaddr_type = addr_type;
3454 /* Store the struct to list */
3455 adapter->addr_filters = g_slist_append(adapter->addr_filters, params);
3459 static const char *adapter_le_service_find_addr_scan_filter_data(
3460 struct btd_adapter *adapter, gchar *string)
3465 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3474 static gboolean adapter_le_service_delete_addr_scan_filter_data(struct btd_adapter *adapter,
3475 int filter_index, gchar *string, int addr_type)
3480 list = g_slist_find_custom(adapter->addr_filters, string, adapter_le_address_cmp);
3484 /* Delete info from the struct to list */
3485 adapter->addr_filters = g_slist_delete_link(adapter->addr_filters, list);
3490 static gboolean adapter_le_service_clear_addr_scan_filter_data(struct btd_adapter *adapter)
3494 g_slist_free_full(adapter->addr_filters, addr_filter_params_free);
3495 adapter->addr_filters = NULL;
3500 static gboolean adapter_le_service_add_uuid_scan_filter_data(struct btd_adapter *adapter,
3501 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3502 uint8_t *p_uuid_mask, int uuid_mask_len)
3505 adapter_le_uuid_params_t *params;
3510 params = g_new0(adapter_le_uuid_params_t, 1);
3514 if (uuid_mask_len == UUID_16_LEN) {
3515 uint16_t *uuid16 = (void *)p_uuid;
3516 sdp_uuid16_create((uuid_t *)&uuid, get_be16(uuid16));
3517 } else if (uuid_mask_len == UUID_32_LEN) {
3518 uint32_t *uuid32 = (void *)p_uuid;
3519 sdp_uuid32_create((uuid_t *)&uuid, get_be32(uuid32));
3521 sdp_uuid128_create((uuid_t *)&uuid, p_uuid);
3523 params->filter_index = filter_index;
3524 params->uuid = (uint8_t *)bt_uuid2string((uuid_t *)&uuid);
3525 params->uuid_mask = g_new0(uint8_t, uuid_mask_len);
3526 memcpy(params->uuid_mask, p_uuid_mask, uuid_mask_len);
3527 params->uuid_len = uuid_mask_len;
3529 /* Store the struct to list */
3530 adapter->solicit_data_filters = g_slist_append(adapter->solicit_data_filters, params);
3535 static adapter_le_uuid_params_t *adapter_le_service_find_uuid_scan_filter_data(struct btd_adapter *adapter,
3541 list = g_slist_find_custom(adapter->solicit_data_filters, p_uuid, adapter_le_uuid_cmp);
3545 /* Delete info from the struct to list */
3551 static gboolean adapter_le_service_delete_uuid_scan_filter_data(struct btd_adapter *adapter,
3552 int filter_index, gboolean is_solicited, uint8_t *p_uuid,
3553 uint8_t *p_uuid_mask, int uuid_mask_len)
3558 list = g_slist_find_custom(adapter->solicit_data_filters, GINT_TO_POINTER(filter_index), adapter_le_uuid_filter_index_cmp);
3562 adapter_le_uuid_params_t *params = list->data;
3563 /* Delete info from the struct to list */
3564 if (params && strcasecmp((const char *)params->uuid, (const char *)p_uuid)) {
3565 adapter->solicit_data_filters = g_slist_delete_link(adapter->solicit_data_filters, list);
3572 static gboolean adapter_le_service_clear_uuid_scan_filter_data(struct btd_adapter *adapter)
3576 g_slist_free_full(adapter->solicit_data_filters, uuid_filter_params_free);
3577 adapter->solicit_data_filters = NULL;
3582 static gboolean adapter_le_service_add_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3583 int filter_index, int company_id, int company_id_mask,
3584 uint8_t *p_data, uint8_t *p_mask, int data_len)
3587 adapter_le_manf_data_params_t *params;
3591 params = g_new0(adapter_le_manf_data_params_t, 1);
3595 params->filter_index = filter_index;
3596 params->company_id = company_id;
3597 params->company_id_mask = company_id_mask;
3598 params->man_data = g_new0(uint8_t, data_len);
3599 memcpy(params->man_data, p_data, data_len);
3600 params->man_data_mask = g_new0(uint8_t, data_len);
3601 memcpy(params->man_data_mask, p_mask, data_len);
3602 params->man_data_len = data_len;
3604 /* Store the struct to list */
3605 adapter->manufaturer_data_filters = g_slist_append(adapter->manufaturer_data_filters, params);
3610 static adapter_le_manf_data_params_t *adapter_le_service_find_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3611 struct eir_msd *msd)
3615 list = g_slist_find_custom(adapter->manufaturer_data_filters, msd, adapter_le_manufacturer_data_cmp);
3624 static gboolean adapter_le_service_delete_manufacturer_scan_filter_data(struct btd_adapter *adapter,
3625 int filter_index, int company_id, int company_id_mask,
3626 uint8_t *p_data, uint8_t *p_mask, int data_len)
3630 list = g_slist_find_custom(adapter->manufaturer_data_filters, GINT_TO_POINTER(filter_index), adapter_le_manufacturer_data_filter_index_cmp);
3634 adapter_le_manf_data_params_t *params = list->data;
3635 /* Delete info from the struct to list */
3636 if (params && strcasecmp((const char *)params->man_data, (const char *)p_data)) {
3637 adapter->manufaturer_data_filters = g_slist_delete_link(adapter->manufaturer_data_filters, list);
3644 static gboolean adapter_le_service_clear_manufacturer_scan_filter_data(struct btd_adapter *adapter)
3648 g_slist_free_full(adapter->manufaturer_data_filters, manufacturer_filter_params_free);
3649 adapter->manufaturer_data_filters = NULL;
3654 static gboolean adapter_le_service_add_local_name_scan_filter_data(struct btd_adapter *adapter,
3655 int filter_index, gchar *name)
3658 adapter_le_local_name_params_t *params;
3662 params = g_new0(adapter_le_local_name_params_t, 1);
3666 params->filter_index = filter_index;
3667 params->local_name = g_strdup(name);
3668 params->name_len = strlen(name);
3670 /* Store the struct to list */
3671 adapter->local_name_filters = g_slist_append(adapter->local_name_filters, params);
3676 static adapter_le_local_name_params_t *adapter_le_service_find_local_name_scan_filter_data(
3677 struct btd_adapter *adapter,
3682 list = g_slist_find_custom(adapter->local_name_filters, name, adapter_le_local_name_cmp);
3691 static gboolean adapter_le_service_delete_local_name_scan_filter_data(struct btd_adapter *adapter,
3692 int filter_index, gchar *name)
3696 list = g_slist_find_custom(adapter->local_name_filters, GINT_TO_POINTER(filter_index), adapter_le_local_name_filter_index_cmp);
3700 adapter_le_local_name_params_t *params = list->data;
3701 /* Delete info from the struct to list */
3702 if (params && strcasecmp((const char *)params->local_name, (const char *)name)) {
3703 adapter->local_name_filters = g_slist_delete_link(adapter->local_name_filters, list);
3710 static gboolean adapter_le_service_clear_local_name_scan_filter_data(struct btd_adapter *adapter)
3714 g_slist_free_full(adapter->local_name_filters, local_name_filter_params_free);
3715 adapter->local_name_filters = NULL;
3720 static gboolean adapter_le_service_add_service_scan_filter_data(struct btd_adapter *adapter,
3721 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3723 adapter_le_service_data_params_t *params;
3727 params = g_new0(adapter_le_service_data_params_t, 1);
3731 params->filter_index = filter_index;
3732 params->service_data = g_new0(uint8_t, data_len);
3733 memcpy(params->service_data, p_data, data_len);
3734 params->service_data_mask = g_new0(uint8_t, data_len);
3735 memcpy(params->service_data_mask, p_mask, data_len);
3736 params->service_data_len = data_len;
3738 /* Store the struct to list */
3739 adapter->service_data_filters = g_slist_append(adapter->service_data_filters, params);
3744 static adapter_le_service_data_params_t* adapter_le_service_find_service_scan_filter_data(
3745 struct btd_adapter *adapter, struct eir_sd *sd)
3750 list = g_slist_find_custom(adapter->service_data_filters, sd, adapter_le_service_data_cmp);
3759 static gboolean adapter_le_service_delete_service_scan_filter_data(struct btd_adapter *adapter,
3760 int filter_index, uint8_t *p_data, uint8_t *p_mask, int data_len)
3765 list = g_slist_find_custom(adapter->service_data_filters, GINT_TO_POINTER(filter_index), adapter_le_service_data_filter_index_cmp);
3769 adapter_le_service_data_params_t *params = list->data;
3770 /* Delete info from the struct to list */
3771 if (params && strcasecmp((const char *)params->service_data, (const char *)p_data)) {
3772 adapter->service_data_filters = g_slist_delete_link(adapter->service_data_filters, list);
3778 static gboolean adapter_le_service_clear_service_scan_filter_data(struct btd_adapter *adapter)
3782 g_slist_free_full(adapter->service_data_filters, service_data_filter_params_free);
3783 adapter->service_data_filters = NULL;
3788 static gboolean adapter_le_service_add_scan_filter_params(struct btd_adapter *adapter,
3789 adapter_le_scan_filter_param_t *params)
3791 adapter_le_scan_filter_param_t *l_params;
3795 l_params = g_new0(adapter_le_scan_filter_param_t, 1);
3799 l_params->action = params->action;
3800 l_params->delivery_mode = params->delivery_mode;
3801 l_params->feature = params->feature;
3802 l_params->filter_logic_type = params->filter_logic_type;
3803 l_params->index = params->index;
3804 l_params->list_logic_type = params->list_logic_type;
3805 l_params->onfound_timeout = params->onfound_timeout;
3806 l_params->onfound_timeout_cnt = params->onfound_timeout_cnt;
3807 l_params->rssi_high_threshold = params->rssi_high_threshold;
3808 l_params->rssi_low_threshold = params->rssi_low_threshold;
3810 /* Store the struct to list */
3811 adapter->scan_params = g_slist_append(adapter->scan_params, l_params);
3816 static adapter_le_scan_filter_param_t *adapter_le_service_find_scan_filter_params(
3817 struct btd_adapter *adapter, int filter_index)
3822 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(filter_index), adapter_le_scan_params_filter_index_cmp);
3831 static gboolean adapter_le_service_delete_scan_filter_params(struct btd_adapter *adapter,
3832 adapter_le_scan_filter_param_t *params)
3837 list = g_slist_find_custom(adapter->scan_params, GINT_TO_POINTER(params->index), adapter_le_scan_params_filter_index_cmp);
3841 adapter->scan_params = g_slist_remove(adapter->scan_params, list);
3846 static gboolean adapter_le_service_clear_scan_filter_params(struct btd_adapter *adapter)
3850 g_slist_free_full(adapter->scan_params, scan_filter_params_free);
3851 adapter->scan_params = NULL;
3856 int adapter_byte_arr_cmp_with_mask(const char *data1, const char *data2,
3857 const char *mask, int data_len)
3861 if (data1 == NULL || data2 == NULL || mask == NULL)
3863 for (i = 0; i < data_len; i++) {
3864 a = data1[i] & mask[i];
3865 b = data2[i] & mask[i];
3867 return (int)(a - b);
3872 static uint8_t validate_for_filter_policy(struct btd_adapter *adapter,
3873 const struct eir_data *eir, gchar *addr)
3875 uint8_t allow_report = NONE_REPORT;
3877 if (adapter->scan_filter_support == FALSE)
3878 allow_report = SCAN_REPORT;
3880 if (adapter_le_service_find_addr_scan_filter_data(adapter, addr))
3881 allow_report = SCAN_REPORT;
3883 if(adapter_le_service_find_local_name_scan_filter_data(adapter, eir->name))
3884 allow_report = SCAN_REPORT;
3887 GSList *list = NULL;
3888 for (list = eir->sd_list; list != NULL; list = g_slist_next(list)) {
3889 struct eir_sd *sd = list->data;
3891 static adapter_le_uuid_params_t *uuid_data = NULL;
3892 static adapter_le_service_data_params_t *service_data = NULL;
3893 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
3894 uuid_data = adapter_le_service_find_uuid_scan_filter_data(adapter, (uint8_t *)sd->uuid);
3895 service_data = adapter_le_service_find_service_scan_filter_data(adapter, sd);
3896 if (service_data != NULL) {
3897 if (!adapter_byte_arr_cmp_with_mask((const char *)service_data->service_data,
3898 (const char *)sd->data, (const char *)service_data->service_data_mask,
3899 service_data->service_data_len)) {
3900 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3901 service_data->filter_index);
3902 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3903 scan_param_data->rssi_low_threshold < eir->tx_power)
3904 allow_report = SCAN_REPORT;
3907 if (uuid_data != NULL) {
3908 if (!adapter_byte_arr_cmp_with_mask((const char *)uuid_data->uuid,
3909 (const char *)sd->uuid, (const char *)uuid_data->uuid_mask,
3910 uuid_data->uuid_len)) {
3911 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3912 uuid_data->filter_index);
3913 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3914 scan_param_data->rssi_low_threshold < eir->tx_power)
3915 allow_report = SCAN_REPORT;
3923 if (eir->msd_list) {
3924 GSList *list = NULL;
3925 for (list = eir->msd_list; list != NULL; list = g_slist_next(list)) {
3926 struct eir_msd *msd = list->data;
3928 static adapter_le_manf_data_params_t *manuf_data;
3929 static adapter_le_scan_filter_param_t *scan_param_data = NULL;
3930 manuf_data = adapter_le_service_find_manufacturer_scan_filter_data(adapter,
3932 if (manuf_data != NULL) {
3933 if (!adapter_byte_arr_cmp_with_mask((const char *)msd->data,
3934 (const char *)manuf_data->man_data, (const char *)manuf_data->man_data_mask,
3935 manuf_data->man_data_len)) {
3936 scan_param_data = adapter_le_service_find_scan_filter_params(adapter,
3937 manuf_data->filter_index);
3938 if (scan_param_data && scan_param_data->rssi_high_threshold > eir->tx_power &&
3939 scan_param_data->rssi_low_threshold < eir->tx_power)
3940 allow_report = SCAN_REPORT;
3942 if (msd->company == COMPANY_ID_APPLE)
3943 allow_report = IBEACON_REPORT;
3949 return allow_report;
3952 gboolean adapter_le_set_platform_scan_filter_params(struct btd_adapter *adapter,
3953 adapter_le_scan_filter_param_t *params)
3955 gboolean ret = TRUE;
3956 DBG("adapter_le_scan_filter_param_t [%d]", params->index);
3957 adapter_le_scan_filter_action_type action_type = params->action;
3959 if (action_type == ADD) {
3960 ret = adapter_le_service_add_scan_filter_params(adapter, params);
3961 } else if (action_type == DELETE) {
3962 ret = adapter_le_service_delete_scan_filter_params(adapter, params);
3963 } else if (action_type == CLEAR) {
3964 ret = adapter_le_service_clear_scan_filter_params(adapter);
3966 DBG("filter_action error");
3970 DBG("Scan Filter VSC :: Action [%x]",
3975 gboolean adapter_le_set_platform_scan_filter_data(struct btd_adapter *adapter,
3976 int client_if, int action,
3977 int filt_type, int filter_index,
3979 int company_id_mask,
3980 int uuid_len, uint8_t *p_uuid,
3981 int uuid_mask_len, uint8_t *p_uuid_mask,
3982 gchar *string, int addr_type,
3983 int data_len, uint8_t *p_data,
3984 int mask_len, uint8_t *p_mask)
3986 gboolean ret = TRUE;
3990 switch (filt_type) {
3991 case TYPE_DEVICE_ADDRESS: {
3992 /* TYPE_DEVICE_ADDRESS */
3993 adapter_le_scan_filter_action_type action_type = action;
3995 if (action_type == ADD) {
3996 ret = adapter_le_service_add_addr_scan_filter_data(adapter,
3997 filter_index, string, addr_type);
3998 } else if (action_type == DELETE) {
3999 ret = adapter_le_service_delete_addr_scan_filter_data(adapter,
4000 filter_index, string, addr_type);
4001 } else if (action_type == CLEAR) {
4002 ret = adapter_le_service_clear_addr_scan_filter_data(adapter);
4004 DBG("filter_action error");
4011 case TYPE_SERVICE_UUID:
4012 case TYPE_SOLICIT_UUID: {
4013 adapter_le_scan_filter_action_type action_type = action;
4015 gboolean is_solicited = (filt_type == TYPE_SOLICIT_UUID) ? TRUE : FALSE;
4017 if (uuid_len != UUID_16_LEN && uuid_len != UUID_32_LEN
4018 && uuid_len != UUID_128_LEN) {
4019 DBG("UUID length error");
4023 if (uuid_len != uuid_mask_len) {
4024 DBG("Both UUID and UUID_MASK length shoule be samed");
4028 if (action_type == ADD) {
4029 ret = adapter_le_service_add_uuid_scan_filter_data(adapter,
4030 filter_index, is_solicited, p_uuid,
4031 p_uuid_mask, uuid_len);
4032 } else if (action_type == DELETE) {
4033 ret = adapter_le_service_delete_uuid_scan_filter_data(adapter,
4034 filter_index, is_solicited, p_uuid,
4035 p_uuid_mask, uuid_len);
4036 } else if (action_type == CLEAR) {
4037 ret = adapter_le_service_clear_uuid_scan_filter_data(adapter);
4039 DBG("filter_action error");
4046 case TYPE_LOCAL_NAME: {
4047 adapter_le_scan_filter_action_type action_type = action;
4049 if (action_type == ADD) {
4050 ret = adapter_le_service_add_local_name_scan_filter_data(adapter,
4051 filter_index, (gchar*)string);
4052 } else if (action_type == DELETE) {
4053 ret = adapter_le_service_delete_local_name_scan_filter_data(adapter,
4054 filter_index, (gchar*)string);
4055 } else if (action_type == CLEAR) {
4056 ret = adapter_le_service_clear_local_name_scan_filter_data(adapter);
4058 DBG("filter_action error");
4065 case TYPE_MANUFACTURER_DATA: {
4066 adapter_le_scan_filter_action_type action_type = action;
4068 if (data_len == 0 || (data_len != mask_len)) {
4069 DBG("parameter length error");
4073 if (action_type == ADD) {
4074 ret = adapter_le_service_add_manufacturer_scan_filter_data(adapter,
4075 filter_index,company_id, company_id_mask, p_data, p_mask, data_len);
4076 } else if (action_type == DELETE) {
4077 ret = adapter_le_service_delete_manufacturer_scan_filter_data(adapter,
4078 filter_index, company_id, company_id_mask, p_data, p_mask, data_len);
4079 } else if (action_type == CLEAR) {
4080 ret = adapter_le_service_clear_manufacturer_scan_filter_data(adapter);
4082 DBG("filter_action error");
4089 case TYPE_SERVICE_DATA: {
4090 adapter_le_scan_filter_action_type action_type = action;
4092 if (data_len == 0 || (data_len != mask_len)) {
4093 DBG("parameter length error");
4097 if (action_type == ADD) {
4098 ret = adapter_le_service_add_service_scan_filter_data(adapter,
4099 filter_index, p_data, p_mask, data_len);
4100 } else if (action_type == DELETE) {
4101 ret = adapter_le_service_delete_service_scan_filter_data(adapter,
4102 filter_index, p_data, p_mask, data_len);
4103 } else if (action_type == CLEAR) {
4104 ret = adapter_le_service_clear_service_scan_filter_data(adapter);
4106 DBG("filter_action error");
4114 DBG("filter_type error");
4122 static int set_adv_data_flag(uint8_t *adv_data, uint8_t *data, int data_len, void *user_data)
4124 struct btd_adapter *adapter = user_data;
4127 adv_data[1] = EIR_FLAGS;
4129 if (adapter->le_static_addr.b[5] != 0)
4130 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER |
4131 EIR_SIM_HOST | EIR_BREDR_UNSUP;
4133 adv_data[2] = EIR_GEN_DISC | EIR_CONTROLLER | EIR_SIM_HOST;
4135 memcpy(adv_data + 3, data, data_len);
4136 return data_len + 3;
4139 static int set_adv_data_device_name(uint8_t *adv_data, int adv_len, char *name)
4145 uint8_t *data = NULL;
4150 data = g_memdup(adv_data, adv_len);
4154 name_len = strlen(name);
4156 for (i = 0; i <adv_len ; i++) {
4158 ad_type = data[i + 1];
4160 if (ad_type == EIR_NAME_COMPLETE) {
4161 /* Move to last position and update local name */
4162 for (j = i; j < adv_len - 2; j++)
4163 adv_data[j] = data[j + 2];
4165 adv_data[j] = name_len + 1;
4166 if (name_len > ADV_DATA_MAX_LENGTH - adv_len) {
4167 adv_data[j] = ADV_DATA_MAX_LENGTH - adv_len + 1;
4168 adv_data[j + 1] = EIR_NAME_SHORT;
4169 memcpy(adv_data + j + 2, name, ADV_DATA_MAX_LENGTH - adv_len);
4171 return ADV_DATA_MAX_LENGTH;
4173 adv_data[j + 1] = EIR_NAME_COMPLETE;
4174 memcpy(adv_data + j + 2, name, name_len);
4176 return adv_len + name_len;
4180 memcpy(adv_data + i, &data[i], ad_len + 1);
4189 static int set_adv_data_tx_power(uint8_t *adv_data, int adv_len, int8_t tx_power)
4194 uint8_t *data = NULL;
4196 data = g_memdup(adv_data, adv_len);
4200 for (i = 0; i <adv_len ; i++) {
4202 ad_type = data[i + 1];
4204 if (ad_type == EIR_TX_POWER) {
4206 adv_data[i + 1] = EIR_TX_POWER;
4207 adv_data[i + 2] = tx_power;
4209 for(j = i + 2; j < adv_len; j++)
4210 adv_data[j + 1] = data[j];
4215 memcpy(adv_data + i, &data[i], ad_len + 1);
4225 static int adapter_le_set_missed_adv_data(uint8_t *p_data, uint8_t data_len,
4226 gboolean is_scan_rsp, char *adapter_name, int8_t tx_power, uint8_t **adv_data, int *adv_len,
4232 data = g_malloc0(ADV_DATA_MAX_LENGTH);
4233 memcpy(data, p_data, data_len);
4236 /* In case multi advertising, need to update the below AD type
4237 since it handled into kernel */
4239 len = set_adv_data_flag(data, p_data, data_len, user_data);
4242 len = set_adv_data_tx_power(data, len, tx_power);
4244 len = set_adv_data_device_name(data, len, adapter_name);
4251 static DBusMessage *adapter_start_custom_discovery(DBusConnection *conn,
4252 DBusMessage *msg, void *user_data)
4254 struct btd_adapter *adapter = user_data;
4255 const char *sender = dbus_message_get_sender(msg);
4256 struct watch_client *client;
4258 const gchar *disc_type;
4260 DBG("sender %s", sender);
4262 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4263 return btd_error_not_ready(msg);
4265 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &disc_type,
4266 DBUS_TYPE_INVALID)) {
4267 return btd_error_invalid_args(msg);
4270 DBG("discovery type = %s", disc_type);
4272 /*Valid strings: "BREDR", "LE", "LE_BREDR" */
4273 if (g_strcmp0(disc_type, "BREDR") == 0)
4274 adapter->disc_type = BT_DISC_TYPE_BREDR_ONLY;
4275 else if (g_strcmp0(disc_type, "LE") == 0)
4276 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4277 else if (g_strcmp0(disc_type, "LE_BREDR") == 0)
4278 adapter->disc_type = BT_DISC_TYPE_LE_BREDR;
4280 return btd_error_invalid_args(msg);
4283 * Every client can only start one discovery, if the client
4284 * already started a discovery then return an error.
4286 list = g_slist_find_custom(adapter->discovery_list, sender,
4289 return btd_error_busy(msg);
4291 client = g_new0(struct watch_client, 1);
4293 client->adapter = adapter;
4294 client->owner = g_strdup(sender);
4295 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4296 discovery_disconnect, client,
4299 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
4303 * Just trigger the discovery here. In case an already running
4304 * discovery in idle phase exists, it will be restarted right
4307 trigger_start_discovery(adapter, 0);
4309 return dbus_message_new_method_return(msg);
4312 static DBusMessage *adapter_start_le_discovery(DBusConnection *conn,
4313 DBusMessage *msg, void *user_data)
4315 struct btd_adapter *adapter = user_data;
4316 const char *sender = dbus_message_get_sender(msg);
4317 struct watch_client *client;
4320 DBG("sender %s", sender);
4322 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4323 return btd_error_not_ready(msg);
4326 * Every client can only start one discovery, if the client
4327 * already started a discovery then return an error.
4330 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4331 DBG("adapter->disc_type[%d]", adapter->disc_type);
4332 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4334 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4337 return btd_error_busy(msg);
4339 client = g_new0(struct watch_client, 1);
4341 client->adapter = adapter;
4342 client->owner = g_strdup(sender);
4343 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
4344 le_discovery_disconnect, client,
4345 le_discovery_destroy);
4347 adapter->le_discovery_list = g_slist_prepend(adapter->le_discovery_list,
4351 * Just trigger the discovery here. In case an already running
4352 * discovery in idle phase exists, it will be restarted right
4355 trigger_start_le_discovery(adapter, 0);
4357 return dbus_message_new_method_return(msg);
4360 static DBusMessage *adapter_stop_le_discovery(DBusConnection *conn,
4361 DBusMessage *msg, void *user_data)
4363 struct btd_adapter *adapter = user_data;
4364 const char *sender = dbus_message_get_sender(msg);
4365 struct mgmt_cp_stop_le_discovery cp;
4366 struct watch_client *client;
4369 DBG("sender %s", sender);
4371 if (adapter->le_discovery_idle_timeout > 0) {
4372 DBG("Remove LE scan trigger");
4373 g_source_remove(adapter->le_discovery_idle_timeout);
4374 adapter->le_discovery_idle_timeout = 0;
4377 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4378 return btd_error_not_ready(msg);
4380 list = g_slist_find_custom(adapter->le_discovery_list, sender,
4383 return btd_error_failed(msg, "No discovery started");
4385 client = list->data;
4387 adapter->disc_type = BT_DISC_TYPE_LE_ONLY;
4388 DBG("adapter->disc_type[%d]", adapter->disc_type);
4389 DBG("adapter->discovery_type [%d]", adapter->discovery_type);
4391 cp.type = adapter->discovery_type;
4392 DBG("cp.type %d", cp.type);
4395 * As long as other discovery clients are still active, just
4396 * clenup client info and return success.
4398 DBG("adapter->le_discovery_list %p", adapter->le_discovery_list);
4399 if (g_slist_next(adapter->le_discovery_list)) {
4401 * The destroy function will cleanup the client information and
4402 * also remove it from the list of discovery clients.
4404 g_dbus_remove_watch(dbus_conn, client->watch);
4405 return dbus_message_new_method_return(msg);
4409 * In the idle phase of a discovery, there is no need to stop it
4410 * and so it is enough to send out the signal and just return.
4412 DBG("cp.type %d", cp.type);
4413 DBG("adapter->discovery_enable %d", adapter->discovery_enable);
4414 if (adapter->discovery_enable == 0x00) {
4415 adapter->le_discovering = false;
4416 g_dbus_remove_watch(dbus_conn, client->watch);
4417 g_dbus_emit_property_changed(dbus_conn, adapter->path,
4418 ADAPTER_INTERFACE, "LEDiscovering");
4420 trigger_passive_scanning(adapter);
4421 return dbus_message_new_method_return(msg);
4424 DBG("adapter->discovery_type %d", adapter->discovery_type);
4426 DBG("cp.type %d", cp.type);
4427 mgmt_send(adapter->mgmt, MGMT_OP_STOP_LE_DISCOVERY,
4428 adapter->dev_id, sizeof(cp), &cp,
4429 stop_le_discovery_complete, client, NULL);
4431 client->msg = dbus_message_ref(msg);
4435 static DBusMessage *adapter_set_advertising(DBusConnection *conn,
4436 DBusMessage *msg, void *data)
4438 struct btd_adapter *adapter = data;
4440 dbus_bool_t enable = FALSE;
4441 dbus_int32_t slot_id;
4443 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4444 return btd_error_not_ready(msg);
4446 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &enable,
4447 DBUS_TYPE_INT32, &slot_id,
4449 return btd_error_invalid_args(msg);
4451 if (adapter->adv_restart_timeout > 0)
4452 return btd_error_in_progress(msg);
4454 DBG("%s advertising slot_id %d", enable ? "Enable" : "Disable", slot_id);
4456 if (adapter_le_is_supported_multi_advertising() && slot_id > 0)
4457 err = adapter_le_enable_multi_adv(adapter, enable, slot_id);
4459 err = set_mode(adapter, MGMT_OP_SET_ADVERTISING, enable);
4462 return btd_error_failed(msg, "Set Advertising failed");
4465 create_advertiser(adapter, slot_id);
4467 if (err && slot_id > 0)
4468 advertising_state_changed(adapter, slot_id, enable);
4470 return dbus_message_new_method_return(msg);
4473 static DBusMessage *adapter_set_advertising_params(DBusConnection *conn,
4474 DBusMessage *msg, void *data)
4476 struct btd_adapter *adapter = data;
4477 struct mgmt_cp_set_advertising_params cp;
4478 dbus_uint32_t interval_min;
4479 dbus_uint32_t interval_max;
4480 dbus_uint32_t filter_policy;
4482 dbus_int32_t tx_power_level;
4483 dbus_int32_t slot_id;
4486 DBG("Set customised advertising parameters");
4488 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4489 return btd_error_not_ready(msg);
4491 if (!dbus_message_get_args(msg, NULL,
4492 DBUS_TYPE_UINT32, &interval_min,
4493 DBUS_TYPE_UINT32, &interval_max,
4494 DBUS_TYPE_UINT32, &filter_policy,
4495 DBUS_TYPE_UINT32, &type,
4496 DBUS_TYPE_INT32, &tx_power_level,
4497 DBUS_TYPE_INT32, &slot_id,
4499 return btd_error_invalid_args(msg);
4501 memset(&cp, 0, sizeof(cp));
4503 DBG("advertising interval min %x, max %x, filter %x type %x, tx power %d",
4504 interval_min, interval_max, filter_policy, type, tx_power_level);
4506 if (filter_policy > 0x03)
4507 return btd_error_invalid_args(msg);
4510 return btd_error_invalid_args(msg);
4512 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4513 adapter_le_adv_inst_info_t *p_inst;
4514 adapter_le_adv_param_t *p_params;
4516 p_inst = g_malloc0(sizeof(adapter_le_adv_inst_info_t));
4517 p_params = g_malloc0(sizeof(adapter_le_adv_param_t));
4518 p_inst->inst_id = slot_id;
4519 p_params->adv_int_min = interval_min;
4520 p_params->adv_int_max = interval_max;
4521 p_params->adv_type = type;
4522 p_params->channel_map = 0x07; /* fixed channel :: will be used all */
4523 p_params->adv_filter_policy = filter_policy;
4524 p_params->tx_power = tx_power_level;
4526 if (adapter->current_settings & MGMT_SETTING_PRIVACY) {
4527 p_inst->bdaddr_type = 0x01;
4528 bacpy(&p_inst->bdaddr, &adapter->rpa);
4529 } else if (adapter->le_static_addr.b[5] != 0) {
4530 p_inst->bdaddr_type = 0x01;
4531 bacpy(&p_inst->bdaddr, &adapter->le_static_addr);
4533 p_inst->bdaddr_type = 0x00;
4534 bacpy(&p_inst->bdaddr, &adapter->bdaddr);
4537 ret = adapter_le_set_multi_adv_params(p_inst, p_params);
4543 return dbus_message_new_method_return(msg);
4545 return btd_error_failed(msg, "set advertising param failed");
4547 cp.interval_max = interval_max;
4548 cp.interval_min = interval_min;
4549 cp.filter_policy = filter_policy;
4552 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_PARAMS,
4553 adapter->dev_id, sizeof(cp), &cp,
4554 NULL, NULL, NULL) > 0)
4555 return dbus_message_new_method_return(msg);
4557 return btd_error_failed(msg, "set advertising param failed");
4561 static DBusMessage *adapter_set_advertising_data(DBusConnection *conn,
4562 DBusMessage *msg, void *data)
4564 struct btd_adapter *adapter = data;
4565 struct mgmt_cp_set_advertising_data cp;
4568 dbus_int32_t slot_id;
4569 uint8_t *adv_data = NULL;
4571 char *adapter_name = adapter->name;
4572 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4574 DBG("Set advertising data");
4576 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4577 return btd_error_not_ready(msg);
4579 if (!dbus_message_get_args(msg, NULL,
4580 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4581 DBUS_TYPE_INT32, &slot_id,
4583 return btd_error_invalid_args(msg);
4585 if (len > ADV_DATA_MAX_LENGTH - 3)
4586 return btd_error_invalid_args(msg);
4588 if (adapter->le_static_addr.b[5] != 0) {
4591 g_strlcpy(le_name, adapter_name,
4592 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4593 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4596 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4597 adapter_name = le_name;
4600 adapter_le_set_missed_adv_data(value, len, FALSE,
4601 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4603 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4604 if (adapter_le_set_multi_adv_data(slot_id, FALSE, adv_len, adv_data)) {
4606 return dbus_message_new_method_return(msg);
4609 return btd_error_failed(msg, "set advertising data failed");
4612 memcpy(&cp, adv_data, adv_len);
4614 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_ADVERTISING_DATA,
4615 adapter->dev_id, adv_len,
4616 &cp, NULL, NULL, NULL) > 0) {
4618 return dbus_message_new_method_return(msg);
4622 return btd_error_failed(msg, "set advertising data failed");
4626 static DBusMessage *adapter_le_scan_filter_param_setup(DBusConnection *conn,
4627 DBusMessage *msg, void *data)
4629 struct btd_adapter *adapter = data;
4630 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4631 dbus_bool_t ctlr_filter_support = TRUE;
4633 dbus_int32_t client_if, action, filt_index;
4634 dbus_int32_t feat_seln, list_logic_type, filt_logic_type;
4635 dbus_int32_t rssi_high_thres, rssi_low_thres, dely_mode;
4636 dbus_int32_t found_timeout, lost_timeout, found_timeout_cnt;
4637 adapter_le_scan_filter_param_t params;
4640 DBG("adapter_le_scan_filter_param_setup");
4642 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4643 return btd_error_not_ready(msg);
4645 if (adapter_le_get_scan_filter_size() == 0)
4646 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4647 return btd_error_not_supported(msg);
4649 ctlr_filter_support = FALSE;
4652 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4653 DBUS_TYPE_INT32, &action,
4654 DBUS_TYPE_INT32, &filt_index,
4655 DBUS_TYPE_INT32, &feat_seln,
4656 DBUS_TYPE_INT32, &list_logic_type,
4657 DBUS_TYPE_INT32, &filt_logic_type,
4658 DBUS_TYPE_INT32, &rssi_high_thres,
4659 DBUS_TYPE_INT32, &rssi_low_thres,
4660 DBUS_TYPE_INT32, &dely_mode,
4661 DBUS_TYPE_INT32, &found_timeout,
4662 DBUS_TYPE_INT32, &lost_timeout,
4663 DBUS_TYPE_INT32, &found_timeout_cnt,
4665 return btd_error_invalid_args(msg);
4667 memset(¶ms, 0, sizeof(params));
4669 params.action = action;
4670 params.index = filt_index;
4671 params.feature = feat_seln;
4672 params.filter_logic_type = filt_logic_type;
4673 params.list_logic_type = list_logic_type;
4674 params.delivery_mode = dely_mode;
4675 params.rssi_high_threshold = rssi_high_thres;
4677 if (params.delivery_mode == ON_FOUND) {
4678 params.rssi_low_threshold = rssi_low_thres;
4679 params.onfound_timeout = found_timeout;
4680 params.onfound_timeout_cnt = found_timeout_cnt;
4681 params.onlost_timeout = lost_timeout;
4684 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4685 if (ctlr_filter_support)
4687 err = adapter_le_set_scan_filter_params(¶ms);
4688 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4690 err = adapter_le_set_platform_scan_filter_params(adapter, ¶ms);
4694 return btd_error_failed(msg, "Failed to scan filter param setup");
4696 return dbus_message_new_method_return(msg);
4699 static DBusMessage *adapter_le_scan_filter_add_remove(DBusConnection *conn,
4700 DBusMessage *msg, void *data)
4702 struct btd_adapter *adapter = data;
4703 struct btd_device *dev = NULL;
4704 dbus_int32_t client_if, action, filt_type, filt_index;
4705 dbus_int32_t company_id, company_id_mask;
4707 dbus_uint32_t address_type = 0;
4708 uint8_t addr_type = 0;
4711 uint8_t *p_uuid, *p_uuid_mask, *p_data, *p_mask;
4712 int32_t uuid_len = 0, uuid_mask_len = 0, data_len = 0, mask_len = 0;
4714 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4715 dbus_bool_t ctlr_filter_support = TRUE;
4718 DBG("adapter_le_scan_filter_add_remove");
4720 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4721 return btd_error_not_ready(msg);
4723 /* if controller does not support vendor specific scan filtering feature
4724 * then add the filter into platform supported scan filters.
4726 if (adapter_le_get_scan_filter_size() == 0) {
4727 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4728 return btd_error_not_supported(msg);
4730 ctlr_filter_support = FALSE;
4734 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4735 DBUS_TYPE_INT32, &action,
4736 DBUS_TYPE_INT32, &filt_type,
4737 DBUS_TYPE_INT32, &filt_index,
4738 DBUS_TYPE_INT32, &company_id,
4739 DBUS_TYPE_INT32, &company_id_mask,
4740 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid, &uuid_len,
4741 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_uuid_mask, &uuid_mask_len,
4742 DBUS_TYPE_STRING, &str,
4743 DBUS_TYPE_UINT32, &address_type,
4744 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_data, &data_len,
4745 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &p_mask, &mask_len,
4747 return btd_error_invalid_args(msg);
4749 if (filt_type == TYPE_DEVICE_ADDRESS) {
4750 list = g_slist_find_custom(adapter->devices, str, device_rpa_cmp);
4752 list = g_slist_find_custom(adapter->devices, str,
4753 device_address_cmp);
4756 if (dev && device_get_rpa_exist(dev) == true) {
4757 ba2str(device_get_address(dev), string);
4758 if (btd_device_get_bdaddr_type(dev) == BDADDR_LE_PUBLIC)
4763 strncpy(string, str, sizeof(string) - 1);
4767 DBG("addr %s, type %d", string, addr_type);
4769 strncpy(string, str, sizeof(string) - 1 );
4772 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4773 if (ctlr_filter_support)
4775 err = adapter_le_set_scan_filter_data(client_if, action, filt_type,
4776 filt_index, company_id, company_id_mask,
4777 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4778 string, addr_type, data_len, p_data, mask_len, p_mask);
4779 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4781 err = adapter_le_set_platform_scan_filter_data(adapter, client_if, action, filt_type,
4782 filt_index, company_id, company_id_mask,
4783 uuid_len, p_uuid, uuid_mask_len, p_uuid_mask,
4784 string, addr_type, data_len, p_data, mask_len, p_mask);
4787 return btd_error_failed(msg, "Failed to add/remove filter");
4789 return dbus_message_new_method_return(msg);
4792 static DBusMessage *adapter_le_scan_filter_clear(DBusConnection *conn,
4793 DBusMessage *msg, void *data)
4795 struct btd_adapter *adapter = data;
4796 dbus_int32_t client_if = 0;
4797 dbus_int32_t filt_index = 0;
4799 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4800 dbus_bool_t ctlr_filter_support = TRUE;
4803 DBG("adapter_le_scan_filter_clear");
4805 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4806 return btd_error_not_ready(msg);
4808 if (adapter_le_get_scan_filter_size() == 0)
4809 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4810 return btd_error_not_supported(msg);
4812 ctlr_filter_support = FALSE;
4815 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4816 DBUS_TYPE_INT32, &filt_index,
4818 return btd_error_invalid_args(msg);
4820 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4821 if (ctlr_filter_support)
4823 err = adapter_le_clear_scan_filter_data(client_if, filt_index);
4824 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4826 err = adapter_le_clear_platform_scan_filter_data(adapter, filt_index);
4830 return btd_error_failed(msg, "Failed to clear filter");
4832 return dbus_message_new_method_return(msg);
4836 static DBusMessage *adapter_le_scan_filter_enable(DBusConnection *conn,
4837 DBusMessage *msg, void *data)
4839 struct btd_adapter *adapter = data;
4840 dbus_bool_t enable = FALSE;
4841 dbus_int32_t client_if = 0;
4843 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4844 dbus_bool_t ctlr_filter_support = TRUE;
4847 DBG("adapter_le_scan_filter_enable");
4849 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4850 return btd_error_not_ready(msg);
4852 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4853 /* if controller does not support vendor specific scan filtering feature
4854 * then enable platform supported scan filtering functionalites.
4857 if (adapter_le_get_scan_filter_size() == 0)
4858 #ifndef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4859 return btd_error_not_supported(msg);
4861 ctlr_filter_support = FALSE;
4864 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_INT32, &client_if,
4865 DBUS_TYPE_BOOLEAN, &enable,
4867 return btd_error_invalid_args(msg);
4869 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4870 if (ctlr_filter_support)
4872 err = adapter_le_enable_scan_filtering(enable);
4873 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
4875 err = adapter_le_enable_platform_scan_filtering(adapter, enable);
4879 return btd_error_failed(msg, "Failed to enable scan filtering");
4881 return dbus_message_new_method_return(msg);
4884 static DBusMessage *adapter_le_set_scan_params(DBusConnection *conn,
4885 DBusMessage *msg, void *data)
4887 struct btd_adapter *adapter = data;
4888 struct mgmt_cp_le_set_scan_params cp;
4893 DBG("Set scan parameters");
4895 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4896 return btd_error_not_ready(msg);
4898 if (!dbus_message_get_args(msg, NULL,
4899 DBUS_TYPE_UINT32, &type,
4900 DBUS_TYPE_UINT32, &interval,
4901 DBUS_TYPE_UINT32, &window,
4903 return btd_error_invalid_args(msg);
4905 DBG("scan type %x, interval %x, window %x",
4906 type, interval, window);
4907 memset(&cp, 0, sizeof(cp));
4910 cp.interval = interval;
4912 adapter->scan_type = type;
4914 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_SCAN_PARAMS,
4915 adapter->dev_id, sizeof(cp), &cp,
4916 NULL, NULL, NULL) > 0)
4917 return dbus_message_new_method_return(msg);
4919 return btd_error_failed(msg, "set scan parameters failed");
4922 static DBusMessage *adapter_set_scan_rsp_data(DBusConnection *conn,
4923 DBusMessage *msg, void *data)
4925 struct btd_adapter *adapter = data;
4926 struct mgmt_cp_set_scan_rsp_data cp;
4929 dbus_int32_t slot_id;
4930 uint8_t *adv_data = NULL;
4933 char *adapter_name = adapter->name;
4934 char le_name[MAX_NAME_LENGTH + 1] = { 0 };
4936 DBG("Set scan response data");
4938 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
4939 return btd_error_not_ready(msg);
4941 if (!dbus_message_get_args(msg, NULL,
4942 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
4943 DBUS_TYPE_INT32, &slot_id,
4945 return btd_error_invalid_args(msg);
4947 if (len > SCAN_RESPONSE_DATA_LENGTH_MAX)
4948 return btd_error_invalid_args(msg);
4950 if (adapter->le_static_addr.b[5] != 0) {
4953 g_strlcpy(le_name, adapter_name,
4954 sizeof(le_name) - LE_BEARER_POSTFIX_LEN);
4955 if (!g_utf8_validate(le_name, -1, (const char **)&ptr))
4958 g_strlcat(le_name, LE_BEARER_POSTFIX, sizeof(le_name));
4959 adapter_name = le_name;
4962 adapter_le_set_missed_adv_data(value, len, TRUE,
4963 adapter_name, adapter->adv_tx_power, &adv_data, &adv_len, adapter);
4965 if (adapter_le_is_supported_multi_advertising() && slot_id > 0) {
4966 if (adapter_le_set_multi_adv_data(slot_id, TRUE, adv_len, (uint8_t *)adv_data)) {
4968 return dbus_message_new_method_return(msg);
4971 return btd_error_failed(msg, "set advertising data failed");
4974 memcpy(&cp, adv_data, adv_len);
4976 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_SCAN_RSP_DATA,
4977 adapter->dev_id, adv_len, &cp,
4978 NULL, NULL, NULL) > 0) {
4980 return dbus_message_new_method_return(msg);
4984 return btd_error_failed(msg, "set scan reponse data failed");
4988 static DBusMessage *adapter_add_device_white_list(DBusConnection *conn,
4989 DBusMessage *msg, void *data)
4991 struct btd_adapter *adapter = data;
4992 struct mgmt_cp_add_dev_white_list cp;
4993 const gchar *address;
4995 dbus_uint32_t address_type;
4996 struct btd_device *dev;
4998 DBG("Add device whie list");
4999 if (dbus_message_get_args(msg, NULL,
5000 DBUS_TYPE_STRING, &address,
5001 DBUS_TYPE_UINT32, &address_type,
5002 DBUS_TYPE_INVALID) == FALSE)
5003 return btd_error_invalid_args(msg);
5005 if (bachk(address) < 0)
5006 return btd_error_invalid_args(msg);
5008 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5009 return btd_error_not_ready(msg);
5011 DBG("addr %s, type %d", address, address_type);
5012 str2ba(address, &bdaddr);
5014 dev = btd_adapter_find_device(adapter, &bdaddr,
5015 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5016 if (dev && device_get_rpa_exist(dev) == true) {
5017 if (adapter_le_is_supported_offloading() == FALSE) {
5018 error("Spec based command is not supported yet");
5019 return btd_error_not_supported(msg);
5022 /* Add IRK value to list */
5023 if (adapter_le_add_irk_to_list(device_get_irk_value(dev),
5024 device_get_address(dev),
5025 btd_device_get_bdaddr_type(dev))) {
5026 return dbus_message_new_method_return(msg);
5028 return btd_error_failed(msg, "Add LE IRK to list failed");
5032 memset(&cp, 0, sizeof(cp));
5034 cp.bdaddr_type = address_type;
5035 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5037 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEV_WHITE_LIST,
5038 adapter->dev_id, sizeof(cp), &cp,
5039 NULL, NULL, NULL) > 0)
5040 return dbus_message_new_method_return(msg);
5042 return btd_error_failed(msg, "add device white list failed");
5045 static DBusMessage *adapter_remove_device_white_list(DBusConnection *conn,
5046 DBusMessage *msg, void *data)
5048 struct btd_adapter *adapter = data;
5049 struct mgmt_cp_remove_dev_white_list cp;
5050 const gchar *address;
5052 dbus_uint32_t address_type;
5053 struct btd_device *dev;
5055 DBG("Remove device whie list");
5057 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5058 return btd_error_not_ready(msg);
5060 if (dbus_message_get_args(msg, NULL,
5061 DBUS_TYPE_STRING, &address,
5062 DBUS_TYPE_UINT32, &address_type,
5063 DBUS_TYPE_INVALID) == FALSE)
5064 return btd_error_invalid_args(msg);
5066 if (bachk(address) < 0)
5067 return btd_error_invalid_args(msg);
5069 DBG("addr %s, type %d", address, address_type);
5070 str2ba(address, &bdaddr);
5072 dev = btd_adapter_find_device(adapter, &bdaddr,
5073 address_type ? BDADDR_LE_RANDOM : BDADDR_LE_PUBLIC);
5074 if (dev && device_get_rpa_exist(dev) == true) {
5075 if (adapter_le_is_supported_offloading() == FALSE) {
5076 error("Spec based command is not supported yet");
5077 return btd_error_not_supported(msg);
5080 /* Remove IRK value to list */
5081 if (adapter_le_remove_irk_to_list(device_get_address(dev),
5082 btd_device_get_bdaddr_type(dev))) {
5083 return dbus_message_new_method_return(msg);
5085 return btd_error_failed(msg, "Remove IRK is failed");
5089 memset(&cp, 0, sizeof(cp));
5091 cp.bdaddr_type = address_type;
5092 memcpy(&cp.bdaddr, &bdaddr, sizeof(bdaddr_t));
5094 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEV_FROM_WHITE_LIST,
5095 adapter->dev_id, sizeof(cp), &cp,
5096 NULL, NULL, NULL) > 0)
5097 return dbus_message_new_method_return(msg);
5099 return btd_error_failed(msg, "remove device white list failed");
5102 static DBusMessage *adapter_clear_device_white_list(DBusConnection *conn,
5103 DBusMessage *msg, void *data)
5105 struct btd_adapter *adapter = data;
5107 DBG("Clear device whie list");
5109 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5110 return btd_error_not_ready(msg);
5112 if (mgmt_send(adapter->mgmt, MGMT_OP_CLEAR_DEV_WHITE_LIST,
5113 adapter->dev_id, 0, NULL,
5114 NULL, NULL, NULL) > 0)
5115 return dbus_message_new_method_return(msg);
5117 return btd_error_failed(msg, "clear white list failed");
5120 static DBusMessage *adapter_set_le_privacy(DBusConnection *conn,
5121 DBusMessage *msg, void *data)
5123 struct btd_adapter *adapter = data;
5125 dbus_bool_t enable_privacy = FALSE;
5127 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
5128 return btd_error_not_supported(msg);
5130 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN,
5131 &enable_privacy, DBUS_TYPE_INVALID))
5132 return btd_error_invalid_args(msg);
5134 if (enable_privacy) {
5135 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
5136 return btd_error_already_exists(msg);
5138 if (!(adapter->current_settings & MGMT_SETTING_PRIVACY))
5139 return btd_error_already_exists(msg);
5142 err = set_privacy(adapter, enable_privacy);
5145 return btd_error_failed(msg, "Set Le Privacy failed");
5148 adapter->current_settings = adapter->current_settings | MGMT_SETTING_PRIVACY;
5150 adapter->current_settings = adapter->current_settings & ~(SETTING_PRIVACY_MASK);
5153 return dbus_message_new_method_return(msg);
5156 static void init_le_static_address(struct btd_adapter *adapter)
5161 char dirname[PATH_MAX];
5163 bdaddr_t le_static_addr;
5165 le_static_addr.b[5] = adapter->bdaddr.b[5] | 0xc0;
5166 for (i = 0; i < 5; i++) {
5167 le_static_addr.b[i] =
5168 (adapter->bdaddr.b[i] & 0x7f) << 1 |
5169 (adapter->bdaddr.b[i] & 0x80) >> 7;
5173 * < How to get Public address from above static address >
5175 * for (i = 0; i < 5; i++) {
5177 * (adapter->le_static_addr.b[i] & 0xfe) >> 1 |
5178 * (adapter->le_static_addr.b[i] & 0x01) << 7;
5180 * bredr_addr.b[5] = {the value from advertising data}
5183 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5184 fd = open(dirname, O_WRONLY | O_CREAT, 0644);
5187 ba2str(&le_static_addr, address);
5188 DBG("LE static random : %s", address);
5189 ret = write(fd, address, strlen(address));
5191 error("Cannot save LE address : %s",
5195 ret = fdatasync(fd);
5197 error("sync failed : %s", strerror(errno));
5201 error("Cannot save LE address");
5205 static void set_le_static_address(struct btd_adapter *adapter)
5210 char dirname[PATH_MAX];
5212 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s", "le_static_addr");
5213 if (access(dirname, F_OK) < 0)
5214 init_le_static_address(adapter);
5216 fd = open(dirname, O_RDONLY);
5218 ret = read(fd, address, sizeof(address));
5220 /* xx:xx:xx:xx:xx:xx */
5222 DBG("LE static random : %s", address);
5223 str2ba(address, &adapter->le_static_addr);
5224 adapter->le_static_addr.b[5] |= 0xc0;
5226 error("Invalid LE address");
5229 error("Cannot get LE address");
5235 static void set_le_static_address_complete(uint8_t status, uint16_t length,
5236 const void *param, void *user_data)
5238 struct btd_adapter *adapter = user_data;
5240 DBG("index %u status 0x%02x", adapter->dev_id, status);
5242 if (status != MGMT_STATUS_SUCCESS) {
5243 error("Failed to set static address for index %u: %s (0x%02x)",
5244 adapter->dev_id, mgmt_errstr(status), status);
5245 if (adapter->le_static_addr.b[5] != 0)
5246 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5248 set_le_static_address(adapter);
5255 static DBusMessage *adapter_set_le_static_address(DBusConnection *conn,
5256 DBusMessage *msg, void *data)
5258 struct btd_adapter *adapter = data;
5259 dbus_bool_t is_enable = FALSE;
5260 struct mgmt_cp_set_static_address cp;
5262 if (!(adapter->supported_settings & MGMT_OP_SET_STATIC_ADDRESS)) {
5263 error("LE static address is not supported");
5264 return btd_error_not_supported(msg);
5267 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_BOOLEAN, &is_enable,
5268 DBUS_TYPE_INVALID)) {
5269 error("Invalid arguments");
5270 return btd_error_invalid_args(msg);
5273 memset(&cp, 0x00, sizeof(cp));
5275 if (adapter->le_static_addr.b[5] != 0) {
5276 DBG("LE static address is already configured");
5277 return dbus_message_new_method_return(msg);
5279 set_le_static_address(adapter);
5280 bacpy(&cp.bdaddr, &adapter->le_static_addr);
5282 if (adapter->le_static_addr.b[5] == 0) {
5283 DBG("LE static address is not configured");
5284 return dbus_message_new_method_return(msg);
5286 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5288 DBG("Set static random address : %d", is_enable);
5290 if (mgmt_send(mgmt_master, MGMT_OP_SET_STATIC_ADDRESS, adapter->dev_id,
5292 set_le_static_address_complete, adapter, NULL) <= 0) {
5293 error("Failed to set static address : %d", is_enable);
5295 bacpy(&adapter->le_static_addr, BDADDR_ANY);
5297 set_le_static_address(adapter);
5298 return btd_error_failed(msg, "Unable to set static address");
5301 return dbus_message_new_method_return(msg);
5304 static DBusMessage *adapter_enable_rssi(DBusConnection *conn,
5305 DBusMessage *msg, void *data)
5307 struct btd_adapter *adapter = data;
5308 struct mgmt_cp_set_enable_rssi cp;
5309 struct mgmt_cp_disable_rssi cp_dis;
5310 bdaddr_t bt_addr = { { 0, } };
5311 const gchar *address = NULL;
5313 const char *sender = dbus_message_get_sender(msg);
5314 dbus_int32_t link_type;
5315 dbus_int32_t low_threshold;
5316 dbus_int32_t in_range_threshold;
5317 dbus_int32_t high_threshold;
5319 DBG("Enable RSSI called");
5320 DBG("sender %s", sender);
5321 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5322 return btd_error_not_ready(msg);
5324 if (!dbus_message_get_args(msg, NULL,
5325 DBUS_TYPE_STRING, &address,
5326 DBUS_TYPE_INT32, &link_type,
5327 DBUS_TYPE_INT32, &low_threshold,
5328 DBUS_TYPE_INT32, &in_range_threshold,
5329 DBUS_TYPE_INT32, &high_threshold,
5331 return btd_error_invalid_args(msg);
5333 DBG("Enable RSSI: [%s %d %d %d %d]", address, link_type,
5334 low_threshold, in_range_threshold, high_threshold);
5336 DBG("BT address [%s]", address);
5337 memset(&bt_addr, 0, sizeof(bdaddr_t));
5338 str2ba(address, &bt_addr);
5339 memset(&cp, 0, sizeof(struct mgmt_cp_set_enable_rssi));
5340 memset(&cp_dis, 0, sizeof(struct mgmt_cp_disable_rssi));
5342 if (bachk(address) < 0)
5343 return btd_error_invalid_args(msg);
5345 // if (!btd_adapter_find_device(adapter, address))
5346 // return btd_error_not_found(msg);
5348 if (low_threshold == 0 && in_range_threshold == 0 && high_threshold == 0) {
5349 cp_dis.bdaddr = bt_addr;
5350 cp_dis.link_type = link_type;
5351 DBG("Disable Request");
5352 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_DISABLE,
5353 adapter->dev_id, sizeof(cp_dis), &cp_dis,
5354 NULL, NULL, NULL) > 0)
5355 return dbus_message_new_method_return(msg);
5357 cp.low_th = low_threshold;
5358 cp.in_range_th = in_range_threshold;
5359 cp.high_th = high_threshold;
5360 cp.bdaddr = bt_addr;
5361 cp.link_type = link_type;
5362 DBG("Enable Request");
5363 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_RSSI_ENABLE,
5364 adapter->dev_id, sizeof(cp), &cp,
5365 NULL, NULL, NULL) > 0)
5366 return dbus_message_new_method_return(msg);
5368 return btd_error_failed(msg, "Enable/Disable RSSI Failed");
5371 static DBusMessage *adapter_get_rssi(DBusConnection *conn,
5372 DBusMessage *msg, void *data)
5374 struct btd_adapter *adapter = data;
5375 struct mgmt_cp_get_raw_rssi cp;
5377 const gchar *address = NULL;
5378 dbus_int32_t link_type;
5379 const char *sender = dbus_message_get_sender(msg);
5381 DBG("Get RSSI called");
5382 DBG("sender %s", sender);
5383 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5384 return btd_error_not_ready(msg);
5386 if (!dbus_message_get_args(msg, NULL,
5387 DBUS_TYPE_STRING, &address,
5388 DBUS_TYPE_INT32, &link_type,
5390 return btd_error_invalid_args(msg);
5392 DBG("BT address [%s] link type [%d]", address, link_type);
5393 memset(&bt_addr, 0, sizeof(bdaddr_t));
5394 str2ba(address, &bt_addr);
5395 memset(&cp, 0, sizeof(struct mgmt_cp_get_raw_rssi));
5397 if (bachk(address) < 0)
5398 return btd_error_invalid_args(msg);
5400 // if (!btd_adapter_find_device(adapter, address))
5401 // return btd_error_not_found(msg);
5403 memcpy(&(cp.bt_address), &bt_addr, sizeof(bdaddr_t));
5404 cp.link_type = link_type;
5405 DBG("RAW RSSI Request");
5406 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_RAW_RSSI,
5407 adapter->dev_id, sizeof(cp), &cp,
5408 NULL, NULL, NULL) > 0)
5409 return dbus_message_new_method_return(msg);
5411 return btd_error_failed(msg, "Get Raw RSSI Failed");
5414 #if !defined(__SPRD_PATCH__)
5415 static void get_adv_tx_power_complete(uint8_t status, uint16_t length,
5416 const void *param, void *user_data)
5418 struct btd_adapter *adapter = user_data;
5419 const struct mgmt_rp_get_adv_tx_power *rp = param;
5422 error("Error ocurred in Getting adv tx power, rp is NULL");
5426 if (status != MGMT_STATUS_SUCCESS) {
5427 error("Failed to get adv tx power: %s (0x%02x)",
5428 mgmt_errstr(status), status);
5432 if (length < sizeof(*rp)) {
5433 error("Wrong size of get adv tx power");
5437 adapter->adv_tx_power = rp->adv_tx_power;
5441 static void adapter_get_adv_tx_power(void *data)
5443 struct btd_adapter *adapter = data;
5445 mgmt_send(adapter->mgmt, MGMT_OP_GET_ADV_TX_POWER,
5446 adapter->dev_id, 0, NULL,
5447 get_adv_tx_power_complete, adapter, NULL);
5452 static DBusMessage *set_wbs_parameters(DBusConnection *conn,
5453 DBusMessage *msg, void *data)
5455 struct btd_adapter *adapter = data;
5456 const gchar *role = NULL;
5457 const gchar *address = NULL;
5458 struct mgmt_cp_set_voice_setting cp;
5459 bdaddr_t bt_addr = { { 0, } };
5463 if (!dbus_message_get_args(msg, NULL,
5464 DBUS_TYPE_STRING, &role,
5465 DBUS_TYPE_STRING, &address,
5466 DBUS_TYPE_INVALID)) {
5467 return btd_error_invalid_args(msg);
5470 DBG("Role = %s", role);
5471 DBG("Address = %s", address);
5473 memset(&cp, 0, sizeof(cp));
5475 cp.voice_setting = BT_VOICE_TRANSPARENT | BT_VOICE_CVSD_16BIT;
5477 if (g_strcmp0(role, "Handsfree") == 0)
5478 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5479 else if (g_strcmp0(role, "Gateway") == 0)
5480 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5482 str2ba(address, &bt_addr);
5483 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5485 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5486 adapter->dev_id, sizeof(cp), &cp,
5487 NULL, NULL, NULL) == 0)
5488 error("mgmt_send failed for voice setting");
5491 return dbus_message_new_method_return(msg);
5494 static DBusMessage *set_nb_parameters(DBusConnection *conn,
5495 DBusMessage *msg, void *data)
5497 struct btd_adapter *adapter = data;
5499 const gchar *address = NULL;
5500 struct mgmt_cp_set_voice_setting cp;
5501 bdaddr_t bt_addr = { { 0, } };
5505 if (!dbus_message_get_args(msg, NULL,
5506 DBUS_TYPE_STRING, &role,
5507 DBUS_TYPE_STRING, &address,
5508 DBUS_TYPE_INVALID)) {
5509 return btd_error_invalid_args(msg);
5512 DBG("Role = %s", role);
5513 DBG("Address = %s", address);
5515 memset(&cp, 0, sizeof(cp));
5517 cp.voice_setting = BT_VOICE_CVSD_16BIT;
5519 if (g_strcmp0(role, "Handsfree") == 0)
5520 cp.sco_role = MGMT_SCO_ROLE_HANDSFREE;
5521 else if (g_strcmp0(role, "Gateway") == 0)
5522 cp.sco_role = MGMT_SCO_ROLE_AUDIO_GATEWAY;
5524 str2ba(address, &bt_addr);
5525 memcpy(&(cp.bdaddr), &bt_addr, sizeof(bdaddr_t));
5527 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_VOICE_SETTING,
5528 adapter->dev_id, sizeof(cp), &cp,
5529 NULL, NULL, NULL) == 0)
5530 error("mgmt_send failed for voice setting");
5534 return dbus_message_new_method_return(msg);
5537 void btd_adapter_set_read_le_data_length_handler(
5538 struct btd_adapter *adapter,
5539 struct le_data_length_read_handler *handler)
5541 adapter->read_handler = handler;
5544 static void le_read_maximum_data_length_return_param_complete(
5545 uint8_t status, uint16_t length,
5546 const void *param, void *user_data)
5548 struct btd_adapter *adapter = user_data;
5549 const struct mgmt_rp_le_read_maximum_data_length *rp = param;
5550 uint16_t max_tx_octects = 0;
5551 uint16_t max_tx_time = 0;
5552 uint16_t max_rx_octects = 0;
5553 uint16_t max_rx_time = 0;
5557 error("Error ocurred in Reading maximum data length, rp is NULL");
5562 if (status != MGMT_STATUS_SUCCESS) {
5563 error("le read maximum data length failed: %s (0x%02x)",
5564 mgmt_errstr(status), status);
5569 if (length < sizeof(*rp)) {
5570 error("Too small le read maximum data length response");
5574 max_tx_octects = rp->max_tx_octets;
5575 max_tx_time =rp->max_tx_time;
5576 max_rx_octects = rp->max_rx_octets;
5577 max_rx_time = rp->max_rx_time;
5581 if (!adapter->read_handler ||
5582 !adapter->read_handler->read_callback) {
5583 g_free(adapter->read_handler);
5587 adapter->read_handler->read_callback(adapter, err,
5588 max_tx_octects, max_tx_time,
5589 max_rx_octects, max_rx_time,
5590 adapter->read_handler->user_data);
5592 g_free(adapter->read_handler);
5593 adapter->read_handler = NULL;
5596 int btd_adapter_le_read_maximum_data_length(
5597 struct btd_adapter *adapter)
5599 if (mgmt_send(adapter->mgmt,
5600 MGMT_OP_LE_READ_MAXIMUM_DATA_LENGTH,
5601 adapter->dev_id, 0, NULL,
5602 le_read_maximum_data_length_return_param_complete,
5609 static gint read_request_cmp(gconstpointer a, gconstpointer b)
5611 const struct le_data_length_read_request *data = a;
5612 const struct btd_adapter *adapter = b;
5614 return data->adapter != adapter;
5617 static struct le_data_length_read_request *find_read_le_data_length_request(
5618 struct btd_adapter *adapter)
5622 match = g_slist_find_custom(read_requests, adapter, read_request_cmp);
5630 static void le_read_data_length_complete(
5631 struct btd_adapter *adapter,
5633 uint16_t max_tx_octects, uint16_t max_tx_time,
5634 uint16_t max_rx_octects, uint16_t max_rx_time,
5638 struct le_data_length_read_request *read_request;
5640 read_request = find_read_le_data_length_request(adapter);
5646 DBG("Failed to read max data length. errno[%d]", err);
5647 reply = btd_error_failed(read_request->msg,
5648 "Failed to read max data length");
5650 reply = g_dbus_create_reply(read_request->msg,
5651 DBUS_TYPE_UINT16, &max_tx_octects,
5652 DBUS_TYPE_UINT16, &max_tx_time,
5653 DBUS_TYPE_UINT16, &max_rx_octects,
5654 DBUS_TYPE_UINT16, &max_rx_time,
5658 reply = btd_error_failed(read_request->msg,
5659 "Failed to create reply.");
5663 read_requests = g_slist_remove(read_requests, read_request);
5664 dbus_message_unref(read_request->msg);
5665 g_free(read_request);
5667 if (!g_dbus_send_message(dbus_conn, reply))
5668 error("D-Bus send failed");
5671 static DBusMessage *le_read_maximum_data_length(
5672 DBusConnection *conn, DBusMessage *msg,
5675 struct btd_adapter *adapter = user_data;
5676 struct le_data_length_read_request *read_request;
5677 struct le_data_length_read_handler *handler;
5679 if (find_read_le_data_length_request(adapter))
5680 return btd_error_in_progress(msg);
5682 if (btd_adapter_le_read_maximum_data_length(adapter))
5683 return btd_error_failed(msg, "Unable to read maximum le data length");
5685 read_request = g_new(struct le_data_length_read_request, 1);
5687 read_request->msg = dbus_message_ref(msg);
5688 read_request->adapter = adapter;
5690 read_requests = g_slist_append(read_requests, read_request);
5692 handler = g_new0(struct le_data_length_read_handler, 1);
5694 handler->read_callback =
5695 (read_max_data_length_cb_t)le_read_data_length_complete;
5697 btd_adapter_set_read_le_data_length_handler(
5698 read_request->adapter, handler);
5704 void le_write_host_suggested_data_length_return_param_complete(
5705 uint8_t status, uint16_t length,
5706 const void *param, void *user_data)
5708 if (status != MGMT_STATUS_SUCCESS) {
5709 error("le write host suggested data length failed: %s (0x%02x)",
5710 mgmt_errstr(status), status);
5716 static DBusMessage *le_write_host_suggested_default_data_length(
5717 DBusConnection *conn, DBusMessage *msg,
5720 struct btd_adapter *adapter = user_data;
5721 struct mgmt_cp_le_write_host_suggested_data_length cp;
5722 dbus_uint16_t def_tx_Octets;
5723 dbus_uint16_t def_tx_time;
5725 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5726 return btd_error_not_ready(msg);
5728 if (!dbus_message_get_args(msg, NULL,
5729 DBUS_TYPE_UINT16, &def_tx_Octets,
5730 DBUS_TYPE_UINT16, &def_tx_time,
5732 return btd_error_invalid_args(msg);
5734 memset(&cp, 0, sizeof(cp));
5735 cp.def_tx_octets = def_tx_Octets;
5736 cp.def_tx_time = def_tx_time;
5738 if (mgmt_send(adapter->mgmt,
5739 MGMT_OP_LE_WRITE_HOST_SUGGESTED_DATA_LENGTH,
5740 adapter->dev_id, sizeof(cp), &cp,
5741 le_write_host_suggested_data_length_return_param_complete,
5743 return dbus_message_new_method_return(msg);
5745 return btd_error_failed(msg, "Unable to write host suggested le data length values");
5748 static void le_read_suggested_default_data_length_return_param_complete(
5749 uint8_t status, uint16_t length,
5750 const void *param, void *user_data)
5752 struct btd_adapter *adapter = user_data;
5753 const struct mgmt_rp_le_read_host_suggested_data_length *rp = param;
5754 uint16_t def_tx_octects, def_tx_time;
5757 error("Error ocurred in Reading suggested data length, rp is NULL");
5758 if (adapter->def_read_handler)
5759 g_free(adapter->def_read_handler->user_data);
5761 g_free(adapter->def_read_handler);
5765 if (status != MGMT_STATUS_SUCCESS) {
5766 error("Read host suggested def le data length values failed: %s (0x%02x)",
5767 mgmt_errstr(status), status);
5771 if (adapter->def_read_handler)
5772 g_free(adapter->def_read_handler->user_data);
5774 g_free(adapter->def_read_handler);
5778 if (length < sizeof(*rp)) {
5781 def_tx_octects = rp->def_tx_octets;
5782 def_tx_time =rp->def_tx_time;
5783 DBG("retrieving host suggested data length values %d %d", def_tx_octects, def_tx_time);
5786 if (!adapter->def_read_handler)
5789 if(!adapter->def_read_handler->read_callback) {
5793 adapter->def_read_handler->read_callback(adapter,
5794 def_tx_octects, def_tx_time,
5795 adapter->def_read_handler->user_data);
5797 if (adapter->def_read_handler)
5798 g_free(adapter->def_read_handler->user_data);
5800 g_free(adapter->def_read_handler);
5801 adapter->def_read_handler = NULL;
5804 int btd_adapter_le_read_suggested_default_data_length(
5805 struct btd_adapter *adapter)
5807 if (mgmt_send(adapter->mgmt,
5808 MGMT_OP_LE_READ_HOST_SUGGESTED_DATA_LENGTH,
5809 adapter->dev_id, 0, NULL,
5810 le_read_suggested_default_data_length_return_param_complete,
5811 adapter, NULL) > 0) {
5818 static void le_read_host_suggested_default_length_complete(
5819 struct btd_adapter *adapter,
5820 uint16_t def_tx_octects, uint16_t def_tx_time,
5824 struct le_data_length_read_request *read_request;
5826 read_request = find_read_le_data_length_request(adapter);
5830 reply = g_dbus_create_reply(read_request->msg,
5831 DBUS_TYPE_UINT16, &def_tx_octects,
5832 DBUS_TYPE_UINT16, &def_tx_time,
5836 btd_error_failed(read_request->msg,
5837 "Failed to read host suggested def data length values");
5841 read_requests = g_slist_remove(read_requests, read_request);
5842 dbus_message_unref(read_request->msg);
5843 g_free(read_request);
5845 if (!g_dbus_send_message(dbus_conn, reply))
5846 error("D-Bus send failed");
5849 static DBusMessage *le_read_host_suggested_default_data_length(
5850 DBusConnection *conn, DBusMessage *msg,
5853 struct btd_adapter *adapter = user_data;
5854 struct le_data_length_read_request *read_request;
5855 struct le_data_length_read_default_data_length_handler *handler;
5857 if (find_read_le_data_length_request(adapter))
5858 return btd_error_in_progress(msg);
5860 if (btd_adapter_le_read_suggested_default_data_length(adapter))
5861 return btd_error_failed(msg, "Unable to read host suggested def data length");
5863 read_request = g_new(struct le_data_length_read_request, 1);
5865 read_request->msg = dbus_message_ref(msg);
5866 read_request->adapter = adapter;
5868 read_requests = g_slist_append(read_requests, read_request);
5870 handler = g_new0(struct le_data_length_read_default_data_length_handler, 1);
5872 handler->read_callback =
5873 (read_host_suggested_default_data_length_cb_t)le_read_host_suggested_default_length_complete;
5875 read_request->adapter->def_read_handler = handler;
5880 static void get_le_batching_available_pkts_complete(
5881 uint8_t status, uint16_t length,
5882 const void *param, void *user_data)
5884 const struct mgmt_rp_get_le_batching_buffer *rp = param;
5885 struct le_batching_request *request =
5886 (struct le_batching_request*)user_data;
5889 if (status != MGMT_STATUS_SUCCESS) {
5890 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
5891 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
5892 reply = btd_error_not_supported(request->msg);
5894 reply = btd_error_failed(request->msg, mgmt_errstr(status));
5898 if (length < sizeof(*rp)) {
5899 reply = btd_error_failed(request->msg,
5900 "Wrong size of get le batching buffer");
5904 DBG("LE Batching buffer: [%u]", rp->buffer);
5905 request->adapter->le_batching_available_pkts = rp->buffer;
5906 reply = g_dbus_create_reply(request->msg,
5907 DBUS_TYPE_UINT32, &rp->buffer,
5910 reply = btd_error_failed(request->msg,
5911 "Failed to create reply.");
5914 if (!g_dbus_send_message(dbus_conn, reply))
5915 error("D-Bus send failed");
5917 dbus_message_unref(request->msg);
5921 static DBusMessage *adapter_get_le_batching_available_pkts(DBusConnection *conn,
5922 DBusMessage *msg, void *data)
5924 struct btd_adapter *adapter = data;
5925 struct le_batching_request *request;
5929 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
5930 return btd_error_not_ready(msg);
5932 if (adapter->le_batching_available_pkts < 0)
5933 return btd_error_not_supported(msg);
5935 if (adapter->le_batching_available_pkts > 0) {
5936 reply = dbus_message_new_method_return(msg);
5940 val = adapter->le_batching_available_pkts;
5941 dbus_message_append_args(reply, DBUS_TYPE_UINT32, &val,
5943 DBG("LE Batching buffer: [%u]", val);
5947 request = g_new(struct le_batching_request, 1);
5949 request->msg = dbus_message_ref(msg);
5950 request->adapter = adapter;
5952 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_LE_BATCHING_BUFFER,
5953 adapter->dev_id, 0, NULL,
5954 get_le_batching_available_pkts_complete, request, NULL) == 0) {
5955 dbus_message_unref(request->msg);
5957 return btd_error_failed(msg, "Unable to get le batching buffer");
5963 static void set_le_batching_enable_complete(
5964 uint8_t status, uint16_t length,
5965 const void *param, void *user_data)
5967 const struct mgmt_rp_set_le_batching_enable *rp = param;
5968 struct le_batching_request *request =
5969 (struct le_batching_request*)user_data;
5973 if (status != MGMT_STATUS_SUCCESS) {
5974 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
5975 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
5976 reply = btd_error_not_supported(request->msg);
5978 reply = btd_error_failed(request->msg, mgmt_errstr(status));
5982 if (length < sizeof(*rp)) {
5983 reply = btd_error_failed(request->msg,
5984 "Wrong size of set le batching enable");
5988 reply = g_dbus_create_reply(request->msg,
5991 reply = btd_error_failed(request->msg,
5992 "Failed to create reply.");
5995 if (!g_dbus_send_message(dbus_conn, reply))
5996 error("D-Bus send failed");
5998 dbus_message_unref(request->msg);
6002 static void set_le_batching_param_complete(
6003 uint8_t status, uint16_t length,
6004 const void *param, void *user_data)
6006 const struct mgmt_rp_set_le_batching_param *rp = param;
6007 struct mgmt_cp_set_le_batching_enable cp;
6008 struct le_batching_set_param_request *request =
6009 (struct le_batching_set_param_request*)user_data;
6012 if (status != MGMT_STATUS_SUCCESS) {
6013 error("mgmt fail: %s (0x%02x)", mgmt_errstr(status), status);
6014 if (status == MGMT_STATUS_UNKNOWN_COMMAND)
6015 reply = btd_error_not_supported(request->msg);
6017 reply = btd_error_failed(request->msg, mgmt_errstr(status));
6021 if (length < sizeof(*rp)) {
6022 reply = btd_error_failed(request->msg,
6023 "Wrong size of set le batching param");
6027 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6028 cp.bdaddr = request->bdaddr;
6030 if (mgmt_send(request->adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6031 request->adapter->dev_id, sizeof(cp), &cp,
6032 set_le_batching_enable_complete, request, NULL) == 0) {
6033 reply = btd_error_failed(request->msg, "Unable to set le batching enable");
6039 if (!g_dbus_send_message(dbus_conn, reply))
6040 error("D-Bus send failed");
6042 dbus_message_unref(request->msg);
6046 static DBusMessage *adapter_enable_le_batching(DBusConnection *conn,
6047 DBusMessage *msg, void *data)
6049 struct btd_adapter *adapter = data;
6050 struct mgmt_cp_set_le_batching_param cp;
6051 struct le_batching_set_param_request *request;
6052 bdaddr_t bt_addr = { { 0, } };
6053 const gchar *address = NULL;
6054 dbus_int32_t packet_threshold;
6055 dbus_int32_t timeout;
6057 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6058 return btd_error_not_ready(msg);
6060 if (!dbus_message_get_args(msg, NULL,
6061 DBUS_TYPE_STRING, &address,
6062 DBUS_TYPE_INT32, &packet_threshold,
6063 DBUS_TYPE_INT32, &timeout,
6065 return btd_error_invalid_args(msg);
6067 if (packet_threshold < 0 || packet_threshold > 0x7fff ||
6068 timeout < 0 || timeout > 0x7fff)
6069 return btd_error_invalid_args(msg);
6071 DBG("Set LE batching param: [%s %d %d]", address,
6072 packet_threshold, timeout);
6074 memset(&bt_addr, 0, sizeof(bdaddr_t));
6075 str2ba(address, &bt_addr);
6076 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_param));
6078 if (bachk(address) < 0)
6079 return btd_error_invalid_args(msg);
6081 cp.bdaddr = bt_addr;
6082 cp.pkt_th = packet_threshold;
6084 cp.timeout = timeout * 100;
6086 request = g_new(struct le_batching_set_param_request, 1);
6087 request->msg = dbus_message_ref(msg);
6088 request->adapter = adapter;
6089 request->bdaddr = bt_addr;
6090 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_PARAM,
6091 adapter->dev_id, sizeof(cp), &cp,
6092 set_le_batching_param_complete, request, NULL) == 0) {
6093 dbus_message_unref(request->msg);
6095 return btd_error_failed(msg, "Unable to set le batching param");
6101 static DBusMessage *adapter_disable_le_batching(DBusConnection *conn,
6102 DBusMessage *msg, void *data)
6104 struct btd_adapter *adapter = data;
6105 struct le_batching_request *request;
6106 struct mgmt_cp_set_le_batching_enable cp;
6107 bdaddr_t bt_addr = { { 0, } };
6108 const gchar *address = NULL;
6110 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6111 return btd_error_not_ready(msg);
6113 if (!dbus_message_get_args(msg, NULL,
6114 DBUS_TYPE_STRING, &address,
6116 return btd_error_invalid_args(msg);
6118 DBG("Disable LE Batching: [%s]", address);
6120 memset(&bt_addr, 0, sizeof(bdaddr_t));
6121 str2ba(address, &bt_addr);
6122 memset(&cp, 0, sizeof(struct mgmt_cp_set_le_batching_enable));
6124 if (bachk(address) < 0)
6125 return btd_error_invalid_args(msg);
6127 cp.bdaddr = bt_addr;
6130 request = g_new(struct le_batching_request, 1);
6131 request->msg = dbus_message_ref(msg);
6132 request->adapter = adapter;
6133 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_LE_BATCHING_ENABLE,
6134 adapter->dev_id, sizeof(cp), &cp,
6135 set_le_batching_enable_complete, request, NULL) == 0) {
6136 dbus_message_unref(request->msg);
6138 return btd_error_failed(msg, "Unable to set le batching enable");
6144 void le_set_data_length_return_param_complete(
6145 uint8_t status, uint16_t length,
6146 const void *param, void *user_data)
6148 if (status != MGMT_STATUS_SUCCESS) {
6149 error("le_set_data_length failed: %s (0x%02x)",
6150 mgmt_errstr(status), status);
6156 int btd_adapter_le_set_data_length(struct btd_adapter *adapter, bdaddr_t *bdaddr,
6157 uint16_t max_tx_octets, uint16_t max_tx_time)
6159 struct mgmt_cp_le_set_data_length cp;
6161 memset(&cp, 0, sizeof(cp));
6163 bacpy(&cp.bdaddr, bdaddr);
6165 cp.max_tx_octets = max_tx_octets;
6166 cp.max_tx_time = max_tx_time;
6168 if (mgmt_send(adapter->mgmt, MGMT_OP_LE_SET_DATA_LENGTH,
6169 adapter->dev_id, sizeof(cp), &cp,
6170 le_set_data_length_return_param_complete,
6177 static DBusMessage *adapter_set_manufacturer_data(DBusConnection *conn,
6178 DBusMessage *msg, void *data)
6180 struct btd_adapter *adapter = data;
6181 struct mgmt_cp_set_manufacturer_data cp;
6185 DBG("Set manufacturer data");
6187 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6188 return btd_error_not_ready(msg);
6190 if (!dbus_message_get_args(msg, NULL,
6191 DBUS_TYPE_ARRAY, DBUS_TYPE_BYTE, &value, &len,
6193 return btd_error_invalid_args(msg);
6195 if (len > EIR_MANUFACTURER_DATA_LENGTH_MAX)
6196 return btd_error_invalid_args(msg);
6198 memcpy(&cp, value, len);
6200 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_MANUFACTURER_DATA,
6201 adapter->dev_id, EIR_MANUFACTURER_DATA_LENGTH_MAX,
6202 &cp, NULL, NULL, NULL) > 0)
6203 return dbus_message_new_method_return(msg);
6205 return btd_error_failed(msg, "Set manufacturer data failed");
6208 static DBusMessage *adapter_get_energy_info(DBusConnection *conn,
6209 DBusMessage *msg, void *user_data)
6212 uint32_t tx_time = 0;
6213 uint32_t rx_time = 0;
6214 uint32_t idle_time = 0;
6215 uint32_t energy_used = 0;
6217 if (adapter_le_get_energy_info(&tx_time, &rx_time,
6218 &idle_time, &energy_used) == FALSE) {
6219 error("Fail to send vcs for getting energy info");
6220 reply = btd_error_not_supported(msg);
6224 reply = g_dbus_create_reply(msg,
6225 DBUS_TYPE_UINT32, &tx_time,
6226 DBUS_TYPE_UINT32, &rx_time,
6227 DBUS_TYPE_UINT32, &idle_time,
6228 DBUS_TYPE_UINT32, &energy_used,
6232 reply = btd_error_failed(msg,
6233 "Failed to create reply.");
6240 #endif /* TIZEN_FEATURE_BLUEZ_MODIFY */
6242 static DBusMessage *start_discovery(DBusConnection *conn,
6243 DBusMessage *msg, void *user_data)
6245 struct btd_adapter *adapter = user_data;
6246 const char *sender = dbus_message_get_sender(msg);
6247 struct watch_client *client;
6248 bool is_discovering;
6251 DBG("sender %s", sender);
6253 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6254 return btd_error_not_ready(msg);
6256 is_discovering = get_discovery_client(adapter, sender, &client);
6259 * Every client can only start one discovery, if the client
6260 * already started a discovery then return an error.
6263 return btd_error_busy(msg);
6266 * If there was pre-set filter, just reconnect it to discovery_list,
6271 return btd_error_busy(msg);
6273 adapter->set_filter_list = g_slist_remove(
6274 adapter->set_filter_list, client);
6275 adapter->discovery_list = g_slist_prepend(
6276 adapter->discovery_list, client);
6281 client = g_new0(struct watch_client, 1);
6283 client->adapter = adapter;
6284 client->owner = g_strdup(sender);
6285 client->discovery_filter = NULL;
6286 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6287 discovery_disconnect, client,
6289 adapter->discovery_list = g_slist_prepend(adapter->discovery_list,
6294 * Just trigger the discovery here. In case an already running
6295 * discovery in idle phase exists, it will be restarted right
6298 err = update_discovery_filter(adapter);
6300 return dbus_message_new_method_return(msg);
6302 /* If the discovery has to be started wait it complete to reply */
6303 if (err == -EINPROGRESS) {
6304 client->msg = dbus_message_ref(msg);
6308 return btd_error_failed(msg, strerror(-err));
6311 static bool parse_uuids(DBusMessageIter *value, struct discovery_filter *filter)
6313 DBusMessageIter arriter;
6315 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_ARRAY)
6318 dbus_message_iter_recurse(value, &arriter);
6319 while (dbus_message_iter_get_arg_type(&arriter) != DBUS_TYPE_INVALID) {
6320 bt_uuid_t uuid, u128;
6321 char uuidstr[MAX_LEN_UUID_STR + 1];
6324 if (dbus_message_iter_get_arg_type(&arriter) !=
6328 dbus_message_iter_get_basic(&arriter, &uuid_param);
6330 if (bt_string_to_uuid(&uuid, uuid_param))
6333 bt_uuid_to_uuid128(&uuid, &u128);
6334 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
6336 filter->uuids = g_slist_prepend(filter->uuids, g_strdup(uuidstr));
6338 dbus_message_iter_next(&arriter);
6344 static bool parse_rssi(DBusMessageIter *value, struct discovery_filter *filter)
6346 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_INT16)
6349 dbus_message_iter_get_basic(value, &filter->rssi);
6350 /* -127 <= RSSI <= +20 (spec V4.2 [Vol 2, Part E] 7.7.65.2) */
6351 if (filter->rssi > 20 || filter->rssi < -127)
6357 static bool parse_pathloss(DBusMessageIter *value,
6358 struct discovery_filter *filter)
6360 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_UINT16)
6363 dbus_message_iter_get_basic(value, &filter->pathloss);
6364 /* pathloss filter must be smaller that PATHLOSS_MAX */
6365 if (filter->pathloss > PATHLOSS_MAX)
6371 static bool parse_transport(DBusMessageIter *value,
6372 struct discovery_filter *filter)
6374 char *transport_str;
6376 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_STRING)
6379 dbus_message_iter_get_basic(value, &transport_str);
6381 if (!strcmp(transport_str, "bredr"))
6382 filter->type = SCAN_TYPE_BREDR;
6383 else if (!strcmp(transport_str, "le"))
6384 filter->type = SCAN_TYPE_LE;
6385 else if (strcmp(transport_str, "auto"))
6391 static bool parse_duplicate_data(DBusMessageIter *value,
6392 struct discovery_filter *filter)
6394 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6397 dbus_message_iter_get_basic(value, &filter->duplicate);
6402 static bool parse_discoverable(DBusMessageIter *value,
6403 struct discovery_filter *filter)
6405 if (dbus_message_iter_get_arg_type(value) != DBUS_TYPE_BOOLEAN)
6408 dbus_message_iter_get_basic(value, &filter->discoverable);
6413 struct filter_parser {
6415 bool (*func)(DBusMessageIter *iter, struct discovery_filter *filter);
6417 { "UUIDs", parse_uuids },
6418 { "RSSI", parse_rssi },
6419 { "Pathloss", parse_pathloss },
6420 { "Transport", parse_transport },
6421 { "DuplicateData", parse_duplicate_data },
6422 { "Discoverable", parse_discoverable },
6426 static bool parse_discovery_filter_entry(char *key, DBusMessageIter *value,
6427 struct discovery_filter *filter)
6429 struct filter_parser *parser;
6431 for (parser = parsers; parser && parser->name; parser++) {
6432 if (!strcmp(parser->name, key))
6433 return parser->func(value, filter);
6436 DBG("Unknown key parameter: %s!\n", key);
6441 * This method is responsible for parsing parameters to SetDiscoveryFilter. If
6442 * filter in msg was empty, sets *filter to NULL. If whole parsing was
6443 * successful, sets *filter to proper value.
6444 * Returns false on any error, and true on success.
6446 static bool parse_discovery_filter_dict(struct btd_adapter *adapter,
6447 struct discovery_filter **filter,
6450 DBusMessageIter iter, subiter, dictiter, variantiter;
6451 bool is_empty = true;
6453 *filter = g_try_malloc(sizeof(**filter));
6457 (*filter)->uuids = NULL;
6458 (*filter)->pathloss = DISTANCE_VAL_INVALID;
6459 (*filter)->rssi = DISTANCE_VAL_INVALID;
6460 (*filter)->type = get_scan_type(adapter);
6461 (*filter)->duplicate = false;
6462 (*filter)->discoverable = false;
6464 dbus_message_iter_init(msg, &iter);
6465 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
6466 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
6469 dbus_message_iter_recurse(&iter, &subiter);
6471 int type = dbus_message_iter_get_arg_type(&subiter);
6474 if (type == DBUS_TYPE_INVALID)
6478 dbus_message_iter_recurse(&subiter, &dictiter);
6480 dbus_message_iter_get_basic(&dictiter, &key);
6481 if (!dbus_message_iter_next(&dictiter))
6484 if (dbus_message_iter_get_arg_type(&dictiter) !=
6488 dbus_message_iter_recurse(&dictiter, &variantiter);
6490 if (!parse_discovery_filter_entry(key, &variantiter, *filter))
6493 dbus_message_iter_next(&subiter);
6502 /* only pathlos or rssi can be set, never both */
6503 if ((*filter)->pathloss != DISTANCE_VAL_INVALID &&
6504 (*filter)->rssi != DISTANCE_VAL_INVALID)
6507 DBG("filtered discovery params: transport: %d rssi: %d pathloss: %d "
6508 " duplicate data: %s discoverable %s", (*filter)->type,
6509 (*filter)->rssi, (*filter)->pathloss,
6510 (*filter)->duplicate ? "true" : "false",
6511 (*filter)->discoverable ? "true" : "false");
6516 g_slist_free_full((*filter)->uuids, g_free);
6522 static DBusMessage *set_discovery_filter(DBusConnection *conn,
6523 DBusMessage *msg, void *user_data)
6525 struct btd_adapter *adapter = user_data;
6526 struct watch_client *client;
6527 struct discovery_filter *discovery_filter;
6528 const char *sender = dbus_message_get_sender(msg);
6529 bool is_discovering;
6531 DBG("sender %s", sender);
6533 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6534 return btd_error_not_ready(msg);
6536 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 8))
6537 return btd_error_not_supported(msg);
6539 /* parse parameters */
6540 if (!parse_discovery_filter_dict(adapter, &discovery_filter, msg))
6541 return btd_error_invalid_args(msg);
6543 is_discovering = get_discovery_client(adapter, sender, &client);
6546 free_discovery_filter(client->discovery_filter);
6547 client->discovery_filter = discovery_filter;
6550 update_discovery_filter(adapter);
6552 if (discovery_filter || is_discovering)
6553 return dbus_message_new_method_return(msg);
6555 /* Removing pre-set filter */
6556 adapter->set_filter_list = g_slist_remove(
6557 adapter->set_filter_list,
6559 discovery_free(client);
6560 DBG("successfully cleared pre-set filter");
6561 } else if (discovery_filter) {
6562 /* Client pre-setting his filter for first time */
6563 client = g_new0(struct watch_client, 1);
6564 client->adapter = adapter;
6565 client->owner = g_strdup(sender);
6566 client->discovery_filter = discovery_filter;
6567 client->watch = g_dbus_add_disconnect_watch(dbus_conn, sender,
6568 discovery_disconnect, client,
6570 adapter->set_filter_list = g_slist_prepend(
6571 adapter->set_filter_list, client);
6573 DBG("successfully pre-set filter");
6576 return dbus_message_new_method_return(msg);
6579 static DBusMessage *stop_discovery(DBusConnection *conn,
6580 DBusMessage *msg, void *user_data)
6582 struct btd_adapter *adapter = user_data;
6583 const char *sender = dbus_message_get_sender(msg);
6584 struct watch_client *client;
6588 DBG("sender %s", sender);
6590 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
6591 return btd_error_not_ready(msg);
6593 list = g_slist_find_custom(adapter->discovery_list, sender,
6596 return btd_error_failed(msg, "No discovery started");
6598 client = list->data;
6601 return btd_error_busy(msg);
6603 err = discovery_stop(client, false);
6606 return dbus_message_new_method_return(msg);
6608 client->msg = dbus_message_ref(msg);
6611 return btd_error_failed(msg, strerror(-err));
6615 static gboolean property_get_address(const GDBusPropertyTable *property,
6616 DBusMessageIter *iter, void *user_data)
6618 struct btd_adapter *adapter = user_data;
6620 const char *str = addr;
6622 ba2str(&adapter->bdaddr, addr);
6624 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6629 static gboolean property_get_address_type(const GDBusPropertyTable *property,
6630 DBusMessageIter *iter, void *user_data)
6632 struct btd_adapter *adapter = user_data;
6635 if ((adapter->current_settings & MGMT_SETTING_LE) &&
6636 (adapter->bdaddr_type == BDADDR_LE_RANDOM))
6641 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6646 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6647 static gboolean property_get_le_address(const GDBusPropertyTable *property,
6648 DBusMessageIter *iter, void *user_data)
6650 struct btd_adapter *adapter = user_data;
6651 DBusMessageIter entry;
6653 const char *str = addr;
6656 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
6657 DBUS_TYPE_STRING_AS_STRING, &entry);
6659 if (adapter->le_static_addr.b[5] != 0) {
6660 ba2str(&adapter->le_static_addr, addr);
6661 type = g_strdup_printf("%d", BDADDR_LE_RANDOM);
6663 ba2str(&adapter->bdaddr, addr);
6664 type = g_strdup_printf("%d", BDADDR_LE_PUBLIC);
6667 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &type);
6668 g_free((void *)type);
6670 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
6672 dbus_message_iter_close_container(iter, &entry);
6678 static gboolean property_get_name(const GDBusPropertyTable *property,
6679 DBusMessageIter *iter, void *user_data)
6681 struct btd_adapter *adapter = user_data;
6682 const char *str = adapter->system_name ? : "";
6684 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6689 static gboolean property_get_alias(const GDBusPropertyTable *property,
6690 DBusMessageIter *iter, void *user_data)
6692 struct btd_adapter *adapter = user_data;
6695 if (adapter->current_alias)
6696 str = adapter->current_alias;
6697 else if (adapter->stored_alias)
6698 str = adapter->stored_alias;
6700 str = adapter->system_name ? : "";
6702 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
6707 static void property_set_alias(const GDBusPropertyTable *property,
6708 DBusMessageIter *iter,
6709 GDBusPendingPropertySet id, void *user_data)
6711 struct btd_adapter *adapter = user_data;
6715 dbus_message_iter_get_basic(iter, &name);
6717 if (g_str_equal(name, "") == TRUE) {
6718 if (adapter->stored_alias == NULL) {
6719 /* no alias set, nothing to restore */
6720 g_dbus_pending_property_success(id);
6724 /* restore to system name */
6725 ret = set_name(adapter, adapter->system_name);
6727 if (g_strcmp0(adapter->stored_alias, name) == 0) {
6728 /* alias already set, nothing to do */
6729 g_dbus_pending_property_success(id);
6734 ret = set_name(adapter, name);
6738 g_free(adapter->stored_alias);
6740 if (g_str_equal(name, "") == TRUE)
6741 adapter->stored_alias = NULL;
6743 adapter->stored_alias = g_strdup(name);
6745 store_adapter_info(adapter);
6747 g_dbus_pending_property_success(id);
6752 g_dbus_pending_property_error(id,
6753 ERROR_INTERFACE ".InvalidArguments",
6754 "Invalid arguments in method call");
6756 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6760 static gboolean property_get_class(const GDBusPropertyTable *property,
6761 DBusMessageIter *iter, void *user_data)
6763 struct btd_adapter *adapter = user_data;
6764 dbus_uint32_t val = adapter->dev_class;
6766 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
6771 static gboolean property_get_a2dp_role(const GDBusPropertyTable *property,
6772 DBusMessageIter *iter, void *user_data)
6774 struct btd_adapter *adapter = user_data;
6775 dbus_uint32_t val = adapter->a2dp_role;
6777 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &val);
6782 static gboolean property_get_mode(struct btd_adapter *adapter,
6783 uint32_t setting, DBusMessageIter *iter)
6787 enable = (adapter->current_settings & setting) ? TRUE : FALSE;
6789 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &enable);
6794 struct property_set_data {
6795 struct btd_adapter *adapter;
6796 GDBusPendingPropertySet id;
6799 static void property_set_mode_complete(uint8_t status, uint16_t length,
6800 const void *param, void *user_data)
6802 struct property_set_data *data = user_data;
6803 struct btd_adapter *adapter = data->adapter;
6805 DBG("%s (0x%02x)", mgmt_errstr(status), status);
6807 if (status != MGMT_STATUS_SUCCESS) {
6808 const char *dbus_err;
6810 btd_error(adapter->dev_id, "Failed to set mode: %s (0x%02x)",
6811 mgmt_errstr(status), status);
6813 if (status == MGMT_STATUS_RFKILLED)
6814 dbus_err = ERROR_INTERFACE ".Blocked";
6816 dbus_err = ERROR_INTERFACE ".Failed";
6818 g_dbus_pending_property_error(data->id, dbus_err,
6819 mgmt_errstr(status));
6823 g_dbus_pending_property_success(data->id);
6826 * The parameters are identical and also the task that is
6827 * required in both cases. So it is safe to just call the
6828 * event handling functions here.
6830 new_settings_callback(adapter->dev_id, length, param, adapter);
6833 static void clear_discoverable(struct btd_adapter *adapter)
6835 if (!kernel_conn_control)
6838 if (!(adapter->current_settings & MGMT_SETTING_DISCOVERABLE))
6841 /* If no timeout is set do nothing as both connectable and discoverable
6842 * flags are persistent on power toggle.
6844 if (!adapter->discoverable_timeout)
6847 /* If timeout was set kernel clears discoverable on its own when
6848 * powering off controller. This would leave connectable flag set
6851 * With kernel control clearing connectable clear also discoverable
6852 * flag so we need to clear connectable.
6854 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
6857 static void property_set_mode(struct btd_adapter *adapter, uint32_t setting,
6858 DBusMessageIter *value,
6859 GDBusPendingPropertySet id)
6861 struct property_set_data *data;
6862 struct mgmt_cp_set_discoverable cp;
6864 dbus_bool_t enable, current_enable;
6865 uint16_t opcode, len;
6868 dbus_message_iter_get_basic(value, &enable);
6870 if (adapter->current_settings & setting)
6871 current_enable = TRUE;
6873 current_enable = FALSE;
6875 if (enable == current_enable || adapter->pending_settings & setting) {
6876 g_dbus_pending_property_success(id);
6880 mode = (enable == TRUE) ? 0x01 : 0x00;
6882 adapter->pending_settings |= setting;
6885 case MGMT_SETTING_POWERED:
6886 opcode = MGMT_OP_SET_POWERED;
6891 clear_discoverable(adapter);
6894 case MGMT_SETTING_DISCOVERABLE:
6895 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
6896 if (kernel_conn_control) {
6898 set_mode(adapter, MGMT_OP_SET_CONNECTABLE,
6901 opcode = MGMT_OP_SET_CONNECTABLE;
6909 memset(&cp, 0, sizeof(cp));
6912 cp.timeout = htobs(adapter->discoverable_timeout);
6914 opcode = MGMT_OP_SET_DISCOVERABLE;
6918 case MGMT_SETTING_BONDABLE:
6919 opcode = MGMT_OP_SET_BONDABLE;
6923 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6924 case MGMT_SETTING_CONNECTABLE:
6925 opcode = MGMT_OP_SET_CONNECTABLE;
6934 DBG("sending %s command for index %u", mgmt_opstr(opcode),
6937 data = g_try_new0(struct property_set_data, 1);
6941 data->adapter = adapter;
6944 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
6946 * Use mgmt_send_nowait to avoid dbus timeout in a state of bonding.
6948 if (mgmt_send_nowait(adapter->mgmt, opcode, adapter->dev_id, len, param,
6949 property_set_mode_complete, data, g_free) > 0)
6951 if (mgmt_send(adapter->mgmt, opcode, adapter->dev_id, len, param,
6952 property_set_mode_complete, data, g_free) > 0)
6959 btd_error(adapter->dev_id, "Failed to set mode for index %u",
6962 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed", NULL);
6965 static gboolean property_get_powered(const GDBusPropertyTable *property,
6966 DBusMessageIter *iter, void *user_data)
6968 struct btd_adapter *adapter = user_data;
6970 return property_get_mode(adapter, MGMT_SETTING_POWERED, iter);
6973 static void property_set_powered(const GDBusPropertyTable *property,
6974 DBusMessageIter *iter,
6975 GDBusPendingPropertySet id, void *user_data)
6977 struct btd_adapter *adapter = user_data;
6979 if (powering_down) {
6980 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
6985 property_set_mode(adapter, MGMT_SETTING_POWERED, iter, id);
6988 static gboolean property_get_discoverable(const GDBusPropertyTable *property,
6989 DBusMessageIter *iter, void *user_data)
6991 struct btd_adapter *adapter = user_data;
6993 return property_get_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter);
6996 static void property_set_discoverable(const GDBusPropertyTable *property,
6997 DBusMessageIter *iter,
6998 GDBusPendingPropertySet id, void *user_data)
7000 struct btd_adapter *adapter = user_data;
7002 if (adapter->discoverable_timeout > 0 &&
7003 !(adapter->current_settings & MGMT_SETTING_POWERED)) {
7004 g_dbus_pending_property_error(id, ERROR_INTERFACE ".Failed",
7009 /* Reset discovery_discoverable as Discoverable takes precedence */
7010 adapter->discovery_discoverable = false;
7012 property_set_mode(adapter, MGMT_SETTING_DISCOVERABLE, iter, id);
7015 static gboolean property_get_discoverable_timeout(
7016 const GDBusPropertyTable *property,
7017 DBusMessageIter *iter, void *user_data)
7019 struct btd_adapter *adapter = user_data;
7020 dbus_uint32_t value = adapter->discoverable_timeout;
7022 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7027 static void property_set_discoverable_timeout(
7028 const GDBusPropertyTable *property,
7029 DBusMessageIter *iter,
7030 GDBusPendingPropertySet id, void *user_data)
7032 struct btd_adapter *adapter = user_data;
7034 dbus_uint32_t value;
7036 dbus_message_iter_get_basic(iter, &value);
7038 adapter->discoverable_timeout = value;
7040 g_dbus_pending_property_success(id);
7042 store_adapter_info(adapter);
7044 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7045 ADAPTER_INTERFACE, "DiscoverableTimeout");
7047 if (adapter->pending_settings & MGMT_SETTING_DISCOVERABLE) {
7048 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7053 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
7060 set_discoverable(adapter, 0x01, adapter->discoverable_timeout);
7063 static gboolean property_get_pairable(const GDBusPropertyTable *property,
7064 DBusMessageIter *iter, void *user_data)
7066 struct btd_adapter *adapter = user_data;
7068 return property_get_mode(adapter, MGMT_SETTING_BONDABLE, iter);
7071 static void property_set_pairable(const GDBusPropertyTable *property,
7072 DBusMessageIter *iter,
7073 GDBusPendingPropertySet id, void *user_data)
7075 struct btd_adapter *adapter = user_data;
7077 property_set_mode(adapter, MGMT_SETTING_BONDABLE, iter, id);
7080 static gboolean property_get_pairable_timeout(
7081 const GDBusPropertyTable *property,
7082 DBusMessageIter *iter, void *user_data)
7084 struct btd_adapter *adapter = user_data;
7085 dbus_uint32_t value = adapter->pairable_timeout;
7087 dbus_message_iter_append_basic(iter, DBUS_TYPE_UINT32, &value);
7092 static void property_set_pairable_timeout(const GDBusPropertyTable *property,
7093 DBusMessageIter *iter,
7094 GDBusPendingPropertySet id, void *user_data)
7096 struct btd_adapter *adapter = user_data;
7097 dbus_uint32_t value;
7099 dbus_message_iter_get_basic(iter, &value);
7101 adapter->pairable_timeout = value;
7103 g_dbus_pending_property_success(id);
7105 store_adapter_info(adapter);
7107 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7108 ADAPTER_INTERFACE, "PairableTimeout");
7110 trigger_pairable_timeout(adapter);
7113 static gboolean property_get_discovering(const GDBusPropertyTable *property,
7114 DBusMessageIter *iter, void *user_data)
7116 struct btd_adapter *adapter = user_data;
7117 dbus_bool_t discovering = adapter->discovering;
7119 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7124 static void add_gatt_uuid(struct gatt_db_attribute *attrib, void *user_data)
7126 GHashTable *uuids = user_data;
7127 bt_uuid_t uuid, u128;
7128 char uuidstr[MAX_LEN_UUID_STR + 1];
7130 if (!gatt_db_service_get_active(attrib))
7133 if (!gatt_db_attribute_get_service_uuid(attrib, &uuid))
7136 bt_uuid_to_uuid128(&uuid, &u128);
7137 bt_uuid_to_string(&u128, uuidstr, sizeof(uuidstr));
7139 g_hash_table_add(uuids, strdup(uuidstr));
7142 static void iter_append_uuid(gpointer key, gpointer value, gpointer user_data)
7144 DBusMessageIter *iter = user_data;
7145 const char *uuid = key;
7147 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &uuid);
7150 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7151 static gboolean property_get_le_discovering(const GDBusPropertyTable *property,
7152 DBusMessageIter *iter, void *user_data)
7154 struct btd_adapter *adapter = user_data;
7155 dbus_bool_t discovering = adapter->le_discovering;
7157 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN, &discovering);
7162 static gboolean property_get_connectable(const GDBusPropertyTable *property,
7163 DBusMessageIter *iter, void *user_data)
7165 struct btd_adapter *adapter = user_data;
7167 return property_get_mode(adapter, MGMT_SETTING_CONNECTABLE, iter);
7170 static void property_set_connectable(const GDBusPropertyTable *property,
7171 DBusMessageIter *iter,
7172 GDBusPendingPropertySet id, void *user_data)
7174 struct btd_adapter *adapter = user_data;
7176 property_set_mode(adapter, MGMT_SETTING_CONNECTABLE, iter, id);
7179 static gboolean property_get_version(const GDBusPropertyTable *property,
7180 DBusMessageIter *iter, void *user_data)
7182 struct btd_adapter *adapter = user_data;
7183 const char *str = adapter->version ? : "";
7185 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7190 static gboolean property_get_supported_le_features(
7191 const GDBusPropertyTable *property,
7192 DBusMessageIter *iter, void *user_data)
7194 const char *str, *val;
7196 DBusMessageIter entry;
7197 struct btd_adapter *adapter = user_data;
7199 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7200 DBUS_TYPE_STRING_AS_STRING, &entry);
7202 value = adapter_le_get_max_adv_instance();
7204 str = g_strdup("adv_inst_max");
7205 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7207 val = g_strdup_printf("%d", value);
7208 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7210 g_free((void *)str);
7211 g_free((void *)val);
7214 value = adapter_le_is_supported_offloading();
7216 str = g_strdup("rpa_offloading");
7217 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7219 val = g_strdup_printf("%d", value);
7220 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7222 g_free((void *)str);
7223 g_free((void *)val);
7226 value = adapter_le_get_scan_filter_size();
7227 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
7229 value = SCAN_FILTER_SLOTS_MAX;
7232 str = g_strdup("max_filter");
7233 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7235 val = g_strdup_printf("%d", value);
7236 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7238 g_free((void *)str);
7239 g_free((void *)val);
7242 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
7243 /* 2M PHY Support */
7244 str = g_strdup("2m_phy");
7245 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7247 if (adapter->le_2m_phy_supported)
7248 val = g_strdup("true");
7250 val = g_strdup("false");
7252 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7254 g_free((void *)str);
7255 g_free((void *)val);
7257 /* CODED PHY Support */
7258 str = g_strdup("coded_phy");
7259 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &str);
7261 if (adapter->le_coded_phy_supported)
7262 val = g_strdup("true");
7264 val = g_strdup("false");
7266 dbus_message_iter_append_basic(&entry, DBUS_TYPE_STRING, &val);
7268 g_free((void *)str);
7269 g_free((void *)val);
7272 dbus_message_iter_close_container(iter, &entry);
7277 static gboolean property_get_ipsp_init_state(
7278 const GDBusPropertyTable *property,
7279 DBusMessageIter *iter, void *data)
7281 struct btd_adapter *adapter = data;
7282 dbus_bool_t ipsp_initialized;
7284 if (adapter->ipsp_intialized)
7285 ipsp_initialized = TRUE;
7287 ipsp_initialized = FALSE;
7289 dbus_message_iter_append_basic(iter, DBUS_TYPE_BOOLEAN,
7296 static gboolean property_get_uuids(const GDBusPropertyTable *property,
7297 DBusMessageIter *iter, void *user_data)
7299 struct btd_adapter *adapter = user_data;
7300 DBusMessageIter entry;
7305 uuids = g_hash_table_new_full(g_str_hash, g_str_equal, free, NULL);
7310 for (l = adapter->services; l != NULL; l = l->next) {
7311 sdp_record_t *rec = l->data;
7314 uuid = bt_uuid2string(&rec->svclass);
7318 g_hash_table_add(uuids, uuid);
7322 db = btd_gatt_database_get_db(adapter->database);
7324 gatt_db_foreach_service(db, NULL, add_gatt_uuid, uuids);
7326 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
7327 DBUS_TYPE_STRING_AS_STRING, &entry);
7328 g_hash_table_foreach(uuids, iter_append_uuid, &entry);
7329 dbus_message_iter_close_container(iter, &entry);
7331 g_hash_table_destroy(uuids);
7336 static gboolean property_exists_modalias(const GDBusPropertyTable *property,
7339 struct btd_adapter *adapter = user_data;
7341 return adapter->modalias ? TRUE : FALSE;
7344 static gboolean property_get_modalias(const GDBusPropertyTable *property,
7345 DBusMessageIter *iter, void *user_data)
7347 struct btd_adapter *adapter = user_data;
7348 const char *str = adapter->modalias ? : "";
7350 dbus_message_iter_append_basic(iter, DBUS_TYPE_STRING, &str);
7355 static int device_path_cmp(gconstpointer a, gconstpointer b)
7357 const struct btd_device *device = a;
7358 const char *path = b;
7359 const char *dev_path = device_get_path(device);
7361 return strcasecmp(dev_path, path);
7364 static DBusMessage *remove_device(DBusConnection *conn,
7365 DBusMessage *msg, void *user_data)
7367 struct btd_adapter *adapter = user_data;
7368 struct btd_device *device;
7372 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
7373 DBUS_TYPE_INVALID) == FALSE)
7374 return btd_error_invalid_args(msg);
7376 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
7378 return btd_error_does_not_exist(msg);
7380 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7381 return btd_error_not_ready(msg);
7383 device = list->data;
7385 btd_device_set_temporary(device, true);
7387 if (!btd_device_is_connected(device)) {
7388 btd_adapter_remove_device(adapter, device);
7389 return dbus_message_new_method_return(msg);
7392 device_request_disconnect(device, msg);
7397 static DBusMessage *get_discovery_filters(DBusConnection *conn,
7398 DBusMessage *msg, void *user_data)
7401 DBusMessageIter iter, array;
7402 struct filter_parser *parser;
7404 reply = dbus_message_new_method_return(msg);
7406 dbus_message_iter_init_append(reply, &iter);
7408 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
7409 DBUS_TYPE_STRING_AS_STRING, &array);
7411 for (parser = parsers; parser && parser->name; parser++) {
7412 dbus_message_iter_append_basic(&array, DBUS_TYPE_STRING,
7416 dbus_message_iter_close_container(&iter, &array);
7421 struct device_connect_data {
7422 struct btd_adapter *adapter;
7428 static void device_browse_cb(struct btd_device *dev, int err, void *user_data)
7430 DBG("err %d (%s)", err, strerror(-err));
7433 btd_device_connect_services(dev, NULL);
7436 static void device_connect_cb(GIOChannel *io, GError *gerr, gpointer user_data)
7438 struct device_connect_data *data = user_data;
7439 struct btd_adapter *adapter = data->adapter;
7440 struct btd_device *device;
7443 DBG("%s", gerr ? gerr->message : "");
7448 /* object might already exist due to mgmt socket event */
7449 device = btd_adapter_get_device(adapter, &data->dst, data->dst_type);
7453 path = device_get_path(device);
7455 g_dbus_send_reply(dbus_conn, data->msg, DBUS_TYPE_OBJECT_PATH, &path,
7458 /* continue with service discovery and connection */
7459 btd_device_set_temporary(device, false);
7460 device_update_last_seen(device, data->dst_type);
7462 if (data->dst_type != BDADDR_BREDR){
7463 g_io_channel_set_close_on_unref(io, FALSE);
7464 device_attach_att(device, io);
7467 device_discover_services(device);
7468 device_wait_for_svc_complete(device, device_browse_cb, NULL);
7470 g_io_channel_unref(io);
7471 dbus_message_unref(data->msg);
7476 g_dbus_send_error(dbus_conn, data->msg, "org.bluez.Failed", NULL);
7477 g_io_channel_unref(io);
7478 dbus_message_unref(data->msg);
7482 static void device_connect(struct btd_adapter *adapter, const bdaddr_t *dst,
7483 uint8_t dst_type, DBusMessage *msg)
7485 struct device_connect_data *data;
7488 data = new0(struct device_connect_data, 1);
7489 data->adapter = adapter;
7490 bacpy(&data->dst, dst);
7491 data->dst_type = dst_type;
7492 data->msg = dbus_message_ref(msg);
7494 if (dst_type == BDADDR_BREDR)
7495 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
7496 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
7497 BT_IO_OPT_SOURCE_TYPE, BDADDR_BREDR,
7498 BT_IO_OPT_DEST_BDADDR, dst,
7499 BT_IO_OPT_DEST_TYPE, BDADDR_BREDR,
7500 BT_IO_OPT_PSM, SDP_PSM,
7501 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
7504 io = bt_io_connect(device_connect_cb, data, NULL, NULL,
7505 BT_IO_OPT_SOURCE_BDADDR, &adapter->bdaddr,
7506 BT_IO_OPT_SOURCE_TYPE, adapter->bdaddr_type,
7507 BT_IO_OPT_DEST_BDADDR, dst,
7508 BT_IO_OPT_DEST_TYPE, dst_type,
7509 BT_IO_OPT_CID, ATT_CID,
7510 BT_IO_OPT_SEC_LEVEL, BT_IO_SEC_LOW,
7514 g_dbus_send_message(dbus_conn,
7515 btd_error_failed(msg, "Connect failed"));
7516 dbus_message_unref(data->msg);
7521 static DBusMessage *connect_device(DBusConnection *conn,
7522 DBusMessage *msg, void *user_data)
7524 struct btd_adapter *adapter = user_data;
7525 DBusMessageIter iter, subiter, dictiter, value;
7526 uint8_t addr_type = BDADDR_BREDR;
7527 bdaddr_t addr = *BDADDR_ANY;
7529 DBG("sender %s", dbus_message_get_sender(msg));
7531 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7532 return btd_error_not_ready(msg);
7534 dbus_message_iter_init(msg, &iter);
7535 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_ARRAY ||
7536 dbus_message_iter_get_element_type(&iter) != DBUS_TYPE_DICT_ENTRY)
7537 return btd_error_invalid_args(msg);
7539 dbus_message_iter_recurse(&iter, &subiter);
7541 int type = dbus_message_iter_get_arg_type(&subiter);
7545 if (type == DBUS_TYPE_INVALID)
7548 dbus_message_iter_recurse(&subiter, &dictiter);
7550 dbus_message_iter_get_basic(&dictiter, &key);
7551 if (!dbus_message_iter_next(&dictiter))
7552 return btd_error_invalid_args(msg);
7554 if (dbus_message_iter_get_arg_type(&dictiter) !=
7556 return btd_error_invalid_args(msg);
7558 dbus_message_iter_recurse(&dictiter, &value);
7560 if (!strcmp(key, "Address")) {
7561 if (dbus_message_iter_get_arg_type(&value) !=
7563 return btd_error_invalid_args(msg);
7565 dbus_message_iter_get_basic(&value, &str);
7567 if (str2ba(str, &addr) < 0 )
7568 return btd_error_invalid_args(msg);
7569 } else if (!strcmp(key, "AddressType")) {
7570 if (dbus_message_iter_get_arg_type(&value) !=
7572 return btd_error_invalid_args(msg);
7574 dbus_message_iter_get_basic(&value, &str);
7577 if (!strcmp(str, "public"))
7578 addr_type = BDADDR_LE_PUBLIC;
7579 else if (!strcmp(str, "random"))
7580 addr_type = BDADDR_LE_RANDOM;
7582 return btd_error_invalid_args(msg);
7584 return btd_error_invalid_args(msg);
7587 dbus_message_iter_next(&subiter);
7590 if (!bacmp(&addr, BDADDR_ANY))
7591 return btd_error_invalid_args(msg);
7593 if (btd_adapter_find_device(adapter, &addr, addr_type))
7594 return btd_error_already_exists(msg);
7596 device_connect(adapter, &addr, addr_type, msg);
7601 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7602 static DBusMessage *adapter_unpair_device(DBusConnection *conn,
7603 DBusMessage *msg, void *user_data)
7606 struct btd_adapter *adapter = user_data;
7607 struct btd_device *device;
7611 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
7612 DBUS_TYPE_INVALID) == FALSE)
7613 return btd_error_invalid_args(msg);
7615 list = g_slist_find_custom(adapter->devices, path, device_path_cmp);
7617 return btd_error_does_not_exist(msg);
7619 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7620 return btd_error_not_ready(msg);
7622 device = list->data;
7624 btd_device_set_temporary(device, TRUE);
7626 if (!btd_device_is_connected(device)) {
7627 btd_adapter_unpair_device(adapter, device);
7628 return dbus_message_new_method_return(msg);
7631 device_request_disconnect(device, msg);
7637 static DBusMessage *create_device(DBusConnection *conn,
7638 DBusMessage *msg, void *data)
7640 struct btd_adapter *adapter = data;
7641 const gchar *address;
7645 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
7646 DBUS_TYPE_INVALID) == FALSE)
7647 return btd_error_invalid_args(msg);
7649 if (bachk(address) < 0)
7650 return btd_error_invalid_args(msg);
7654 str2ba(address, &addr);
7655 btd_adapter_get_device(adapter, &addr, BDADDR_BREDR);
7658 return dbus_message_new_method_return(msg);
7661 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
7664 struct btd_adapter *adapter = data;
7665 struct btd_device *device;
7667 const gchar *address;
7669 const gchar *dev_path;
7671 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
7673 return btd_error_invalid_args(msg);
7675 l = g_slist_find_custom(adapter->devices, address, device_rpa_cmp);
7677 l = g_slist_find_custom(adapter->devices, address,
7678 device_address_cmp);
7680 return btd_error_does_not_exist(msg);
7684 reply = dbus_message_new_method_return(msg);
7688 dev_path = device_get_path(device);
7690 dbus_message_append_args(reply,
7691 DBUS_TYPE_OBJECT_PATH, &dev_path,
7697 static gboolean adapter_ipsp_connected(struct btd_adapter *adapter)
7701 DBG("%s", adapter->path);
7703 for (l = adapter->connections; l != NULL; l = next) {
7704 struct btd_device *dev = l->data;
7706 next = g_slist_next(l);
7708 if (device_is_ipsp_connected(dev))
7715 static void adapter_set_ipsp_init_state(struct btd_adapter *adapter, gboolean initialized)
7717 if (adapter->ipsp_intialized == initialized)
7720 adapter->ipsp_intialized = initialized;
7722 g_dbus_emit_property_changed(dbus_conn, adapter->path,
7723 ADAPTER_INTERFACE, "IpspInitStateChanged");
7726 static void deinitialize_6lowpan_complete(uint8_t status, uint16_t length,
7727 const void *param, void *user_data)
7729 struct btd_adapter *adapter = user_data;
7730 bool initialized = FALSE;
7732 if (status != MGMT_STATUS_SUCCESS)
7733 error("De-Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
7734 adapter->dev_id, mgmt_errstr(status), status);
7736 adapter_set_ipsp_init_state(adapter, initialized);
7737 DBG("De-Initialize BT 6lowpan successfully for hci%u",
7742 static bool deinitialize_6lowpan(struct btd_adapter *adapter)
7744 struct mgmt_cp_enable_6lowpan cp;
7746 memset(&cp, 0, sizeof(cp));
7748 cp.enable_6lowpan = DEINIT_6LOWPAN;
7749 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
7750 adapter->dev_id, sizeof(cp), &cp,
7751 deinitialize_6lowpan_complete, adapter, NULL) > 0)
7754 error("Failed to de-initialize BT 6Lowpan for index %u",
7759 static void initialize_6lowpan_complete(uint8_t status, uint16_t length,
7760 const void *param, void *user_data)
7762 struct btd_adapter *adapter = user_data;
7763 bool initialized = TRUE;
7765 if (status != MGMT_STATUS_SUCCESS)
7766 error("Initialize BT 6lowpan failed for hci%u: %s (0x%02x)",
7767 adapter->dev_id, mgmt_errstr(status), status);
7769 adapter_set_ipsp_init_state(adapter, initialized);
7770 DBG("Initialize BT 6lowpan successfully for hci%u",
7775 static bool initialize_6lowpan(struct btd_adapter *adapter)
7777 struct mgmt_cp_enable_6lowpan cp;
7779 memset(&cp, 0, sizeof(cp));
7781 cp.enable_6lowpan = INIT_6LOWPAN;
7782 if (mgmt_send(adapter->mgmt, MGMT_OP_ENABLE_6LOWPAN,
7783 adapter->dev_id, sizeof(cp), &cp,
7784 initialize_6lowpan_complete, adapter, NULL) > 0)
7787 error("Failed to initialize BT 6Lowpan for index %u",
7792 static DBusMessage *adapter_initialize_ipsp(DBusConnection *conn,
7793 DBusMessage *msg, void *data)
7795 struct btd_adapter *adapter = data;
7798 DBG("Initialize IPSP");
7800 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7801 return btd_error_not_ready(msg);
7803 if (adapter->ipsp_intialized)
7804 return btd_error_already_exists(msg);
7806 /* Enable BT 6lowpan in kernel */
7807 err = initialize_6lowpan(adapter);
7810 return btd_error_failed(msg, "Failed to initialize BT 6lowpan");
7812 return dbus_message_new_method_return(msg);
7815 static DBusMessage *adapter_deinitialize_ipsp(DBusConnection *conn,
7816 DBusMessage *msg, void *data)
7818 struct btd_adapter *adapter = data;
7821 DBG("De-initialize IPSP");
7823 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
7824 return btd_error_not_ready(msg);
7826 if (!adapter->ipsp_intialized)
7827 return btd_error_not_permitted(msg, "IPSP not initialized");
7829 if (adapter_ipsp_connected(adapter))
7830 return btd_error_not_permitted(msg, "IPSP Client device found connected");
7832 /* Disable BT 6lowpan in kernel */
7833 err = deinitialize_6lowpan(adapter);
7836 return btd_error_failed(msg, "Failed to deinitialize BT 6lowpan");
7838 return dbus_message_new_method_return(msg);
7842 static const GDBusMethodTable adapter_methods[] = {
7843 { GDBUS_ASYNC_METHOD("StartDiscovery", NULL, NULL, start_discovery) },
7844 { GDBUS_METHOD("SetDiscoveryFilter",
7845 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
7846 set_discovery_filter) },
7847 { GDBUS_ASYNC_METHOD("StopDiscovery", NULL, NULL, stop_discovery) },
7848 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7849 { GDBUS_METHOD("StartCustomDiscovery",
7850 GDBUS_ARGS({ "type", "s" }), NULL,
7851 adapter_start_custom_discovery) },
7852 { GDBUS_METHOD("StartLEDiscovery", NULL, NULL,
7853 adapter_start_le_discovery) },
7854 { GDBUS_ASYNC_METHOD("StopLEDiscovery", NULL, NULL,
7855 adapter_stop_le_discovery) },
7856 { GDBUS_METHOD("SetAdvertising",
7857 GDBUS_ARGS({ "enable", "b" },
7858 { "slot_id", "i" }), NULL,
7859 adapter_set_advertising) },
7860 { GDBUS_METHOD("SetAdvertisingParameters",
7861 GDBUS_ARGS({ "interval_min", "u" },
7862 { "interval_max", "u" },
7863 { "filter_policy", "u" },
7865 { "tx_power_level", "i" },
7866 { "slot_id", "i" }), NULL,
7867 adapter_set_advertising_params) },
7868 { GDBUS_METHOD("SetAdvertisingData",
7869 GDBUS_ARGS({ "value", "ay" },
7870 { "slot_id", "i" }), NULL,
7871 adapter_set_advertising_data) },
7872 { GDBUS_METHOD("SetScanParameters",
7873 GDBUS_ARGS({ "type", "u" },
7874 { "interval", "u" },
7875 { "window", "u" }), NULL,
7876 adapter_le_set_scan_params) },
7877 { GDBUS_ASYNC_METHOD("scan_filter_param_setup",
7878 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
7879 { "filt_index", "i" }, { "feat_seln", "i"},
7880 { "list_logic_type", "i" }, { "filt_logic_type", "i"},
7881 { "rssi_high_thres", "i" }, { "rssi_low_thres", "i"},
7882 { "dely_mode", "i" }, { "found_timeout", "i"},
7883 { "lost_timeout", "i" }, { "found_timeout_cnt", "i"}), NULL,
7884 adapter_le_scan_filter_param_setup) },
7885 { GDBUS_ASYNC_METHOD("scan_filter_add_remove",
7886 GDBUS_ARGS({ "client_if", "i" }, { "action", "i" },
7887 { "filt_type", "i" }, { "filt_index", "i"},
7888 { "company_id", "i" }, { "company_id_mask", "i"},
7889 { "p_uuid", "ay" }, { "p_uuid_mask", "ay" },
7890 { "string", "s" }, { "address_type", "u" },
7891 /*{ "data_len", "i" },*/ { "p_data", "ay" },
7892 /*{ "mask_len", "i" },*/ { "p_mask", "ay" }), NULL,
7893 adapter_le_scan_filter_add_remove) },
7894 { GDBUS_ASYNC_METHOD("scan_filter_clear",
7895 GDBUS_ARGS({ "client_if", "i" }, { "filt_index", "i" }), NULL,
7896 adapter_le_scan_filter_clear) },
7897 { GDBUS_ASYNC_METHOD("scan_filter_enable",
7898 GDBUS_ARGS({ "client_if", "i" }, { "enable", "b" }), NULL,
7899 adapter_le_scan_filter_enable) },
7900 { GDBUS_METHOD("InitializeIpsp",
7902 adapter_initialize_ipsp) },
7903 { GDBUS_METHOD("DeinitializeIpsp",
7905 adapter_deinitialize_ipsp) },
7906 { GDBUS_METHOD("SetScanRespData",
7907 GDBUS_ARGS({ "value", "ay" },
7908 { "slot_id", "i" }), NULL,
7909 adapter_set_scan_rsp_data) },
7910 { GDBUS_METHOD("AddDeviceWhiteList",
7911 GDBUS_ARGS({ "address", "s" },
7912 { "address_type", "u" }), NULL,
7913 adapter_add_device_white_list) },
7914 { GDBUS_METHOD("RemoveDeviceWhiteList",
7915 GDBUS_ARGS({ "address", "s" },
7916 { "address_type", "u" }), NULL,
7917 adapter_remove_device_white_list) },
7918 { GDBUS_METHOD("ClearDeviceWhiteList",
7920 adapter_clear_device_white_list) },
7921 { GDBUS_METHOD("SetLePrivacy",
7922 GDBUS_ARGS({ "enable", "b" }), NULL,
7923 adapter_set_le_privacy) },
7924 { GDBUS_METHOD("SetLeStaticRandomAddress",
7925 GDBUS_ARGS({ "enable", "b" }), NULL,
7926 adapter_set_le_static_address) },
7927 { GDBUS_ASYNC_METHOD("EnableRssi",
7928 GDBUS_ARGS({ "bt_address", "s" },
7929 { "link_type", "i" },
7931 { "in_range_th", "i" },
7934 adapter_enable_rssi) },
7935 { GDBUS_ASYNC_METHOD("GetRssiStrength",
7936 GDBUS_ARGS({ "bt_address", "s" }, { "link_type", "i" }),
7938 adapter_get_rssi) },
7939 { GDBUS_ASYNC_METHOD("UnpairDevice",
7940 GDBUS_ARGS({ "device", "o" }), NULL, adapter_unpair_device) },
7941 { GDBUS_METHOD("FindDevice",
7942 GDBUS_ARGS({ "address", "s" }),
7943 GDBUS_ARGS({ "device", "o" }),
7945 { GDBUS_METHOD("SetWbsParameters",
7946 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
7948 set_wbs_parameters) },
7949 { GDBUS_METHOD("SetNbParameters",
7950 GDBUS_ARGS({ "role", "s" }, { "bt_address", "s" }),
7952 set_nb_parameters) },
7953 { GDBUS_METHOD("SetManufacturerData",
7954 GDBUS_ARGS({ "value", "ay" }), NULL,
7955 adapter_set_manufacturer_data) },
7956 { GDBUS_ASYNC_METHOD("CreateDevice",
7957 GDBUS_ARGS({ "address", "s" }), NULL,
7959 { GDBUS_METHOD("GetEnergyInfo",
7961 GDBUS_ARGS({ "tx_time", "u" },
7963 { "idle_time", "u" },
7964 { "energy_used", "u" }),
7965 adapter_get_energy_info) },
7967 { GDBUS_ASYNC_METHOD("RemoveDevice",
7968 GDBUS_ARGS({ "device", "o" }), NULL, remove_device) },
7969 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
7970 { GDBUS_ASYNC_METHOD("LEReadMaximumDataLength", NULL,
7971 GDBUS_ARGS({"maxTxOctets", "q" }, { "maxTxTime", "q" },
7972 {"maxRxOctets", "q" }, { "maxRxTime", "q" }),
7973 le_read_maximum_data_length)},
7974 { GDBUS_ASYNC_METHOD("LEWriteHostSuggestedDataLength",
7975 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }), NULL,
7976 le_write_host_suggested_default_data_length)},
7977 { GDBUS_ASYNC_METHOD("LEReadHostSuggestedDataLength", NULL,
7978 GDBUS_ARGS({"def_tx_octets", "q" }, { "def_tx_time", "q" }),
7979 le_read_host_suggested_default_data_length)},
7980 { GDBUS_ASYNC_METHOD("GetLeBatchingAvailablePkts",
7982 GDBUS_ARGS({ "AvailablePkts", "u" }),
7983 adapter_get_le_batching_available_pkts) },
7984 { GDBUS_ASYNC_METHOD("EnableLeBatching",
7985 GDBUS_ARGS({ "bt_address", "s" },
7986 { "packet_threshold", "i" },
7989 adapter_enable_le_batching) },
7990 { GDBUS_ASYNC_METHOD("DisableLeBatching",
7991 GDBUS_ARGS({ "bt_address", "s" }),
7993 adapter_disable_le_batching) },
7995 { GDBUS_METHOD("GetDiscoveryFilters", NULL,
7996 GDBUS_ARGS({ "filters", "as" }),
7997 get_discovery_filters) },
7998 { GDBUS_EXPERIMENTAL_ASYNC_METHOD("ConnectDevice",
7999 GDBUS_ARGS({ "properties", "a{sv}" }), NULL,
8004 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8005 static const GDBusSignalTable adapter_signals[] = {
8006 { GDBUS_SIGNAL("AdvertisingEnabled",
8007 GDBUS_ARGS({ "slot_id", "i" },
8008 { "enabled", "b"})) },
8009 { GDBUS_SIGNAL("RssiEnabled",
8010 GDBUS_ARGS({"address","s"},
8011 { "link_type", "i" },
8012 { "enabled", "b"})) },
8013 { GDBUS_SIGNAL("RssiAlert",
8014 GDBUS_ARGS({"address","s"},
8015 { "link_type", "i" },
8016 { "alert_type", "i" },
8017 { "rssi_dbm", "i"})) },
8018 { GDBUS_SIGNAL("RawRssi",
8019 GDBUS_ARGS({"address","s"},
8020 { "link_type", "i" },
8021 { "rssi_dbm", "i"})) },
8022 { GDBUS_SIGNAL("HardwareError", NULL) },
8023 { GDBUS_SIGNAL("TxTimeoutError", NULL) },
8028 static const GDBusPropertyTable adapter_properties[] = {
8029 { "Address", "s", property_get_address },
8030 { "AddressType", "s", property_get_address_type },
8031 { "Name", "s", property_get_name },
8032 { "Alias", "s", property_get_alias, property_set_alias },
8033 { "Class", "u", property_get_class },
8034 { "Powered", "b", property_get_powered, property_set_powered },
8035 { "Discoverable", "b", property_get_discoverable,
8036 property_set_discoverable },
8037 { "DiscoverableTimeout", "u", property_get_discoverable_timeout,
8038 property_set_discoverable_timeout },
8039 { "Pairable", "b", property_get_pairable, property_set_pairable },
8040 { "PairableTimeout", "u", property_get_pairable_timeout,
8041 property_set_pairable_timeout },
8042 { "Discovering", "b", property_get_discovering },
8043 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8044 { "LEDiscovering", "b", property_get_le_discovering },
8046 { "UUIDs", "as", property_get_uuids },
8047 { "Modalias", "s", property_get_modalias, NULL,
8048 property_exists_modalias },
8049 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8050 { "Connectable", "b", property_get_connectable,
8051 property_set_connectable },
8052 { "Version", "s", property_get_version },
8053 { "SupportedLEFeatures", "as", property_get_supported_le_features},
8054 { "IpspInitStateChanged", "b", property_get_ipsp_init_state},
8055 { "LEAddress", "as", property_get_le_address },
8056 { "A2dpRole", "u", property_get_a2dp_role },
8062 static int str2buf(const char *str, uint8_t *buf, size_t blen)
8069 memset(buf, 0, blen);
8071 dlen = MIN((strlen(str) / 2), blen);
8073 for (i = 0; i < dlen; i++)
8074 sscanf(str + (i * 2), "%02hhX", &buf[i]);
8079 static struct link_key_info *get_key_info(GKeyFile *key_file, const char *peer)
8081 struct link_key_info *info = NULL;
8084 str = g_key_file_get_string(key_file, "LinkKey", "Key", NULL);
8085 if (!str || strlen(str) < 32)
8088 info = g_new0(struct link_key_info, 1);
8090 str2ba(peer, &info->bdaddr);
8092 if (!strncmp(str, "0x", 2))
8093 str2buf(&str[2], info->key, sizeof(info->key));
8095 str2buf(&str[0], info->key, sizeof(info->key));
8097 info->type = g_key_file_get_integer(key_file, "LinkKey", "Type", NULL);
8098 info->pin_len = g_key_file_get_integer(key_file, "LinkKey", "PINLength",
8107 static struct smp_ltk_info *get_ltk(GKeyFile *key_file, const char *peer,
8108 uint8_t peer_type, const char *group)
8110 struct smp_ltk_info *ltk = NULL;
8111 GError *gerr = NULL;
8116 key = g_key_file_get_string(key_file, group, "Key", NULL);
8117 if (!key || strlen(key) < 32)
8120 rand = g_key_file_get_string(key_file, group, "Rand", NULL);
8124 ltk = g_new0(struct smp_ltk_info, 1);
8126 /* Default to assuming a master key */
8129 str2ba(peer, <k->bdaddr);
8130 ltk->bdaddr_type = peer_type;
8133 * Long term keys should respond to an identity address which can
8134 * either be a public address or a random static address. Keys
8135 * stored for resolvable random and unresolvable random addresses
8138 * This is an extra sanity check for older kernel versions or older
8139 * daemons that might have been instructed to store long term keys
8140 * for these temporary addresses.
8142 if (ltk->bdaddr_type == BDADDR_LE_RANDOM &&
8143 (ltk->bdaddr.b[5] & 0xc0) != 0xc0) {
8149 if (!strncmp(key, "0x", 2))
8150 str2buf(&key[2], ltk->val, sizeof(ltk->val));
8152 str2buf(&key[0], ltk->val, sizeof(ltk->val));
8154 if (!strncmp(rand, "0x", 2)) {
8156 str2buf(&rand[2], (uint8_t *) &rand_le, sizeof(rand_le));
8157 ltk->rand = le64_to_cpu(rand_le);
8159 sscanf(rand, "%" PRIu64, <k->rand);
8162 ltk->authenticated = g_key_file_get_integer(key_file, group,
8163 "Authenticated", NULL);
8164 ltk->enc_size = g_key_file_get_integer(key_file, group, "EncSize",
8166 ltk->ediv = g_key_file_get_integer(key_file, group, "EDiv", NULL);
8168 master = g_key_file_get_boolean(key_file, group, "Master", &gerr);
8172 ltk->master = master;
8181 static struct smp_ltk_info *get_ltk_info(GKeyFile *key_file, const char *peer,
8182 uint8_t bdaddr_type)
8186 return get_ltk(key_file, peer, bdaddr_type, "LongTermKey");
8189 static struct smp_ltk_info *get_slave_ltk_info(GKeyFile *key_file,
8191 uint8_t bdaddr_type)
8193 struct smp_ltk_info *ltk;
8197 ltk = get_ltk(key_file, peer, bdaddr_type, "SlaveLongTermKey");
8199 ltk->master = false;
8204 static struct irk_info *get_irk_info(GKeyFile *key_file, const char *peer,
8205 uint8_t bdaddr_type)
8207 struct irk_info *irk = NULL;
8210 str = g_key_file_get_string(key_file, "IdentityResolvingKey", "Key", NULL);
8211 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8214 if (strlen(str) < 32) {
8219 if (!str || strlen(str) < 32)
8223 irk = g_new0(struct irk_info, 1);
8225 str2ba(peer, &irk->bdaddr);
8226 irk->bdaddr_type = bdaddr_type;
8228 if (!strncmp(str, "0x", 2))
8229 str2buf(&str[2], irk->val, sizeof(irk->val));
8231 str2buf(&str[0], irk->val, sizeof(irk->val));
8232 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
8240 static struct conn_param *get_conn_param(GKeyFile *key_file, const char *peer,
8241 uint8_t bdaddr_type)
8243 struct conn_param *param;
8245 if (!g_key_file_has_group(key_file, "ConnectionParameters"))
8248 param = g_new0(struct conn_param, 1);
8250 param->min_interval = g_key_file_get_integer(key_file,
8251 "ConnectionParameters",
8252 "MinInterval", NULL);
8253 param->max_interval = g_key_file_get_integer(key_file,
8254 "ConnectionParameters",
8255 "MaxInterval", NULL);
8256 param->latency = g_key_file_get_integer(key_file,
8257 "ConnectionParameters",
8259 param->timeout = g_key_file_get_integer(key_file,
8260 "ConnectionParameters",
8262 str2ba(peer, ¶m->bdaddr);
8263 param->bdaddr_type = bdaddr_type;
8269 static int generate_and_write_irk(uint8_t *irk, GKeyFile *key_file,
8270 const char *filename)
8272 struct bt_crypto *crypto;
8273 char str_irk_out[33];
8278 crypto = bt_crypto_new();
8280 error("Failed to open crypto");
8284 if (!bt_crypto_random_bytes(crypto, irk, 16)) {
8285 error("Failed to generate IRK");
8286 bt_crypto_unref(crypto);
8290 bt_crypto_unref(crypto);
8292 for (i = 0; i < 16; i++)
8293 sprintf(str_irk_out + (i * 2), "%02x", irk[i]);
8295 str_irk_out[32] = '\0';
8296 info("Generated IRK successfully");
8298 g_key_file_set_string(key_file, "General", "IdentityResolvingKey",
8300 str = g_key_file_to_data(key_file, &length, NULL);
8301 g_file_set_contents(filename, str, length, NULL);
8303 DBG("Generated IRK written to file");
8307 static int load_irk(struct btd_adapter *adapter, uint8_t *irk)
8309 char filename[PATH_MAX];
8314 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/identity",
8315 btd_adapter_get_storage_dir(adapter));
8317 key_file = g_key_file_new();
8318 g_key_file_load_from_file(key_file, filename, 0, NULL);
8320 str_irk = g_key_file_get_string(key_file, "General",
8321 "IdentityResolvingKey", NULL);
8323 info("No IRK stored");
8324 ret = generate_and_write_irk(irk, key_file, filename);
8325 g_key_file_free(key_file);
8329 g_key_file_free(key_file);
8331 if (strlen(str_irk) != 32 || str2buf(str_irk, irk, 16)) {
8332 /* TODO re-create new IRK here? */
8333 error("Invalid IRK format, disabling privacy");
8339 DBG("Successfully read IRK from file");
8343 static void set_privacy_complete(uint8_t status, uint16_t length,
8344 const void *param, void *user_data)
8346 struct btd_adapter *adapter = user_data;
8348 if (status != MGMT_STATUS_SUCCESS) {
8349 btd_error(adapter->dev_id, "Failed to set privacy: %s (0x%02x)",
8350 mgmt_errstr(status), status);
8354 DBG("Successfuly set privacy for index %u", adapter->dev_id);
8357 static int set_privacy(struct btd_adapter *adapter, uint8_t privacy)
8359 struct mgmt_cp_set_privacy cp;
8361 memset(&cp, 0, sizeof(cp));
8366 if (load_irk(adapter, irk) == 0) {
8367 cp.privacy = privacy;
8368 memcpy(cp.irk, irk, 16);
8372 DBG("sending set privacy command for index %u", adapter->dev_id);
8373 DBG("setting privacy mode 0x%02x for index %u", cp.privacy,
8376 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
8377 adapter->dev_id, sizeof(cp), &cp,
8378 set_privacy_complete, adapter, NULL) > 0)
8381 btd_error(adapter->dev_id, "Failed to set privacy for index %u",
8388 static void load_link_keys_complete(uint8_t status, uint16_t length,
8389 const void *param, void *user_data)
8391 struct btd_adapter *adapter = user_data;
8393 if (status != MGMT_STATUS_SUCCESS) {
8394 btd_error(adapter->dev_id,
8395 "Failed to load link keys for hci%u: %s (0x%02x)",
8396 adapter->dev_id, mgmt_errstr(status), status);
8400 DBG("link keys loaded for hci%u", adapter->dev_id);
8403 static void load_link_keys(struct btd_adapter *adapter, GSList *keys,
8406 struct mgmt_cp_load_link_keys *cp;
8407 struct mgmt_link_key_info *key;
8408 size_t key_count, cp_size;
8413 * If the controller does not support BR/EDR operation,
8414 * there is no point in trying to load the link keys into
8417 * This is an optimization for Low Energy only controllers.
8419 if (!(adapter->supported_settings & MGMT_SETTING_BREDR))
8422 key_count = g_slist_length(keys);
8424 DBG("hci%u keys %zu debug_keys %d", adapter->dev_id, key_count,
8427 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
8429 cp = g_try_malloc0(cp_size);
8431 btd_error(adapter->dev_id, "No memory for link keys for hci%u",
8437 * Even if the list of stored keys is empty, it is important to
8438 * load an empty list into the kernel. That way it is ensured
8439 * that no old keys from a previous daemon are present.
8441 * In addition it is also the only way to toggle the different
8442 * behavior for debug keys.
8444 cp->debug_keys = debug_keys;
8445 cp->key_count = htobs(key_count);
8447 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
8448 struct link_key_info *info = l->data;
8450 bacpy(&key->addr.bdaddr, &info->bdaddr);
8451 key->addr.type = BDADDR_BREDR;
8452 key->type = info->type;
8453 memcpy(key->val, info->key, 16);
8454 key->pin_len = info->pin_len;
8457 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_LINK_KEYS,
8458 adapter->dev_id, cp_size, cp,
8459 load_link_keys_complete, adapter, NULL);
8464 btd_error(adapter->dev_id, "Failed to load link keys for hci%u",
8468 static gboolean load_ltks_timeout(gpointer user_data)
8470 struct btd_adapter *adapter = user_data;
8472 btd_error(adapter->dev_id, "Loading LTKs timed out for hci%u",
8475 adapter->load_ltks_timeout = 0;
8477 mgmt_cancel(adapter->mgmt, adapter->load_ltks_id);
8478 adapter->load_ltks_id = 0;
8483 static void load_ltks_complete(uint8_t status, uint16_t length,
8484 const void *param, void *user_data)
8486 struct btd_adapter *adapter = user_data;
8488 if (status != MGMT_STATUS_SUCCESS) {
8489 btd_error(adapter->dev_id,
8490 "Failed to load LTKs for hci%u: %s (0x%02x)",
8491 adapter->dev_id, mgmt_errstr(status), status);
8494 adapter->load_ltks_id = 0;
8496 g_source_remove(adapter->load_ltks_timeout);
8497 adapter->load_ltks_timeout = 0;
8499 DBG("LTKs loaded for hci%u", adapter->dev_id);
8502 static void load_ltks(struct btd_adapter *adapter, GSList *keys)
8504 struct mgmt_cp_load_long_term_keys *cp;
8505 struct mgmt_ltk_info *key;
8506 size_t key_count, cp_size;
8510 * If the controller does not support Low Energy operation,
8511 * there is no point in trying to load the long term keys
8514 * While there is no harm in loading keys into the kernel,
8515 * this is an optimization to avoid a confusing warning
8516 * message when the loading of the keys timed out due to
8517 * a kernel bug (see comment below).
8519 if (!(adapter->supported_settings & MGMT_SETTING_LE))
8522 key_count = g_slist_length(keys);
8524 DBG("hci%u keys %zu", adapter->dev_id, key_count);
8526 cp_size = sizeof(*cp) + (key_count * sizeof(*key));
8528 cp = g_try_malloc0(cp_size);
8530 btd_error(adapter->dev_id, "No memory for LTKs for hci%u",
8536 * Even if the list of stored keys is empty, it is important to
8537 * load an empty list into the kernel. That way it is ensured
8538 * that no old keys from a previous daemon are present.
8540 cp->key_count = htobs(key_count);
8542 for (l = keys, key = cp->keys; l != NULL; l = g_slist_next(l), key++) {
8543 struct smp_ltk_info *info = l->data;
8545 bacpy(&key->addr.bdaddr, &info->bdaddr);
8546 key->addr.type = info->bdaddr_type;
8547 memcpy(key->val, info->val, sizeof(info->val));
8548 key->rand = cpu_to_le64(info->rand);
8549 key->ediv = cpu_to_le16(info->ediv);
8550 key->type = info->authenticated;
8551 key->master = info->master;
8552 key->enc_size = info->enc_size;
8555 adapter->load_ltks_id = mgmt_send(adapter->mgmt,
8556 MGMT_OP_LOAD_LONG_TERM_KEYS,
8557 adapter->dev_id, cp_size, cp,
8558 load_ltks_complete, adapter, NULL);
8562 if (adapter->load_ltks_id == 0) {
8563 btd_error(adapter->dev_id, "Failed to load LTKs for hci%u",
8569 * This timeout handling is needed since the kernel is stupid
8570 * and forgets to send a command complete response. However in
8571 * case of failures it does send a command status.
8573 adapter->load_ltks_timeout = g_timeout_add_seconds(2,
8574 load_ltks_timeout, adapter);
8577 static void load_irks_complete(uint8_t status, uint16_t length,
8578 const void *param, void *user_data)
8580 struct btd_adapter *adapter = user_data;
8582 if (status == MGMT_STATUS_UNKNOWN_COMMAND) {
8583 btd_info(adapter->dev_id,
8584 "Load IRKs failed: Kernel doesn't support LE Privacy");
8588 if (status != MGMT_STATUS_SUCCESS) {
8589 btd_error(adapter->dev_id,
8590 "Failed to load IRKs for hci%u: %s (0x%02x)",
8591 adapter->dev_id, mgmt_errstr(status), status);
8595 DBG("IRKs loaded for hci%u", adapter->dev_id);
8598 static void load_irks(struct btd_adapter *adapter, GSList *irks)
8600 struct mgmt_cp_load_irks *cp;
8601 struct mgmt_irk_info *irk;
8602 size_t irk_count, cp_size;
8607 * If the controller does not support LE Privacy operation,
8608 * there is no support for loading identity resolving keys
8611 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
8614 irk_count = g_slist_length(irks);
8616 DBG("hci%u irks %zu", adapter->dev_id, irk_count);
8618 cp_size = sizeof(*cp) + (irk_count * sizeof(*irk));
8620 cp = g_try_malloc0(cp_size);
8622 btd_error(adapter->dev_id, "No memory for IRKs for hci%u",
8628 * Even if the list of stored keys is empty, it is important to
8629 * load an empty list into the kernel. That way we tell the
8630 * kernel that we are able to handle New IRK events.
8632 cp->irk_count = htobs(irk_count);
8634 for (l = irks, irk = cp->irks; l != NULL; l = g_slist_next(l), irk++) {
8635 struct irk_info *info = l->data;
8637 bacpy(&irk->addr.bdaddr, &info->bdaddr);
8638 irk->addr.type = info->bdaddr_type;
8639 memcpy(irk->val, info->val, sizeof(irk->val));
8642 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_IRKS, adapter->dev_id,
8643 cp_size, cp, load_irks_complete, adapter, NULL);
8648 btd_error(adapter->dev_id, "Failed to IRKs for hci%u",
8652 static void load_conn_params_complete(uint8_t status, uint16_t length,
8653 const void *param, void *user_data)
8655 struct btd_adapter *adapter = user_data;
8657 if (status != MGMT_STATUS_SUCCESS) {
8658 btd_error(adapter->dev_id,
8659 "hci%u Load Connection Parameters failed: %s (0x%02x)",
8660 adapter->dev_id, mgmt_errstr(status), status);
8664 DBG("Connection Parameters loaded for hci%u", adapter->dev_id);
8667 static void load_conn_params(struct btd_adapter *adapter, GSList *params)
8669 struct mgmt_cp_load_conn_param *cp;
8670 struct mgmt_conn_param *param;
8671 size_t param_count, cp_size;
8676 * If the controller does not support Low Energy operation,
8677 * there is no point in trying to load the connection
8678 * parameters into the kernel.
8680 if (!(adapter->supported_settings & MGMT_SETTING_LE))
8683 param_count = g_slist_length(params);
8685 DBG("hci%u conn params %zu", adapter->dev_id, param_count);
8687 cp_size = sizeof(*cp) + (param_count * sizeof(*param));
8689 cp = g_try_malloc0(cp_size);
8691 btd_error(adapter->dev_id,
8692 "Failed to allocate memory for connection parameters");
8696 cp->param_count = htobs(param_count);
8698 for (l = params, param = cp->params; l; l = g_slist_next(l), param++) {
8699 struct conn_param *info = l->data;
8701 bacpy(¶m->addr.bdaddr, &info->bdaddr);
8702 param->addr.type = info->bdaddr_type;
8703 param->min_interval = htobs(info->min_interval);
8704 param->max_interval = htobs(info->max_interval);
8705 param->latency = htobs(info->latency);
8706 param->timeout = htobs(info->timeout);
8709 id = mgmt_send(adapter->mgmt, MGMT_OP_LOAD_CONN_PARAM, adapter->dev_id,
8710 cp_size, cp, load_conn_params_complete, adapter, NULL);
8715 btd_error(adapter->dev_id, "Load connection parameters failed");
8718 static uint8_t get_le_addr_type(GKeyFile *keyfile)
8723 type = g_key_file_get_string(keyfile, "General", "AddressType", NULL);
8725 return BDADDR_LE_PUBLIC;
8727 if (g_str_equal(type, "public"))
8728 addr_type = BDADDR_LE_PUBLIC;
8729 else if (g_str_equal(type, "static"))
8730 addr_type = BDADDR_LE_RANDOM;
8732 addr_type = BDADDR_LE_PUBLIC;
8739 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8740 static uint8_t get_addr_type(GKeyFile *keyfile)
8744 uint8_t bdaddr_type = BDADDR_BREDR;
8747 /* Load device technology */
8748 techno = g_key_file_get_string_list(keyfile, "General",
8749 "SupportedTechnologies", NULL, NULL);
8753 for (t = techno; *t; t++) {
8754 if (g_str_equal(*t, "LE"))
8759 bdaddr_type = BDADDR_BREDR;
8761 str = g_key_file_get_string(keyfile, "General",
8762 "AddressType", NULL);
8764 if (str && g_str_equal(str, "public"))
8765 bdaddr_type = BDADDR_LE_PUBLIC;
8766 else if (str && g_str_equal(str, "static"))
8767 bdaddr_type = BDADDR_LE_RANDOM;
8769 error("Unknown LE device technology");
8780 static void probe_devices(void *user_data)
8782 struct btd_device *device = user_data;
8784 device_probe_profiles(device, btd_device_get_uuids(device));
8787 static void load_devices(struct btd_adapter *adapter)
8789 char dirname[PATH_MAX];
8790 GSList *keys = NULL;
8791 GSList *ltks = NULL;
8792 GSList *irks = NULL;
8793 GSList *params = NULL;
8794 GSList *added_devices = NULL;
8796 struct dirent *entry;
8798 snprintf(dirname, PATH_MAX, STORAGEDIR "/%s",
8799 btd_adapter_get_storage_dir(adapter));
8801 dir = opendir(dirname);
8803 btd_error(adapter->dev_id,
8804 "Unable to open adapter storage directory: %s",
8809 while ((entry = readdir(dir)) != NULL) {
8810 struct btd_device *device;
8811 char filename[PATH_MAX];
8813 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8814 struct link_key_info *key_info = NULL;
8815 struct smp_ltk_info *ltk_info = NULL;
8816 struct smp_ltk_info *slave_ltk_info = NULL;
8817 GSList *list = NULL;
8818 struct device_addr_type addr;
8820 struct link_key_info *key_info;
8821 struct smp_ltk_info *ltk_info;
8822 struct smp_ltk_info *slave_ltk_info;
8825 struct irk_info *irk_info;
8826 struct conn_param *param;
8827 uint8_t bdaddr_type;
8829 if (entry->d_type == DT_UNKNOWN)
8830 entry->d_type = util_get_dt(dirname, entry->d_name);
8832 if (entry->d_type != DT_DIR || bachk(entry->d_name) < 0)
8835 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8839 str2ba(entry->d_name, &bdaddr);
8841 if (!bacmp(&bdaddr, BDADDR_ANY)) {
8842 error("No Bluetooth address");
8847 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
8848 btd_adapter_get_storage_dir(adapter),
8851 key_file = g_key_file_new();
8852 g_key_file_load_from_file(key_file, filename, 0, NULL);
8854 key_info = get_key_info(key_file, entry->d_name);
8856 keys = g_slist_append(keys, key_info);
8858 bdaddr_type = get_le_addr_type(key_file);
8860 ltk_info = get_ltk_info(key_file, entry->d_name, bdaddr_type);
8862 ltks = g_slist_append(ltks, ltk_info);
8864 slave_ltk_info = get_slave_ltk_info(key_file, entry->d_name,
8867 ltks = g_slist_append(ltks, slave_ltk_info);
8869 irk_info = get_irk_info(key_file, entry->d_name, bdaddr_type);
8871 irks = g_slist_append(irks, irk_info);
8873 param = get_conn_param(key_file, entry->d_name, bdaddr_type);
8875 params = g_slist_append(params, param);
8877 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8878 str2ba(entry->d_name, &addr.bdaddr);
8879 addr.bdaddr_type = get_addr_type(key_file);
8880 if (addr.bdaddr_type == 0xff) {
8881 error("No SupportedTechnologies. Skipping");
8885 list = g_slist_find_custom(adapter->devices, &addr,
8886 device_addr_type_strict_cmp);
8888 list = g_slist_find_custom(adapter->devices, entry->d_name,
8889 device_address_cmp);
8892 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8893 DBG("Skip already loaded device [%s] [%d]",
8894 entry->d_name, addr.bdaddr_type);
8896 device = list->data;
8900 device = device_create_from_storage(adapter, entry->d_name,
8905 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
8910 * After loading IRK information from file,
8911 * store it into device->bdaddr.
8912 * RPA is stored in device->rpa_addr
8914 ba2str(device_get_address(device), idaddr);
8916 DBG("irk address: %s, rpa_exist %d",
8917 idaddr, device_get_rpa_exist(device));
8919 if (device_get_rpa_exist(device) == true) {
8921 str2ba(idaddr, &key_info->bdaddr);
8924 ltks = g_slist_remove(ltks, ltk_info);
8925 ltk_info = get_ltk_info(key_file,
8926 idaddr, bdaddr_type);
8928 ltks = g_slist_append(ltks, ltk_info);
8931 if (slave_ltk_info) {
8932 ltks = g_slist_remove(ltks, slave_ltk_info);
8933 slave_ltk_info = get_slave_ltk_info(key_file,
8934 idaddr, bdaddr_type);
8936 ltks = g_slist_append(ltks, slave_ltk_info);
8940 str2ba(idaddr, &irk_info->bdaddr);
8941 device_set_irk_value(device, irk_info->val);
8945 str2ba(idaddr, ¶m->bdaddr);
8950 btd_device_set_temporary(device, false);
8951 adapter->devices = g_slist_append(adapter->devices, device);
8953 /* TODO: register services from pre-loaded list of primaries */
8955 added_devices = g_slist_append(added_devices, device);
8959 device_set_paired(device, BDADDR_BREDR);
8960 device_set_bonded(device, BDADDR_BREDR);
8963 if (ltk_info || slave_ltk_info) {
8964 device_set_paired(device, bdaddr_type);
8965 device_set_bonded(device, bdaddr_type);
8968 device_set_ltk_enc_size(device,
8969 ltk_info->enc_size);
8970 else if (slave_ltk_info)
8971 device_set_ltk_enc_size(device,
8972 slave_ltk_info->enc_size);
8976 g_key_file_free(key_file);
8981 load_link_keys(adapter, keys, main_opts.debug_keys);
8982 g_slist_free_full(keys, g_free);
8984 load_ltks(adapter, ltks);
8985 g_slist_free_full(ltks, g_free);
8986 load_irks(adapter, irks);
8987 g_slist_free_full(irks, g_free);
8988 load_conn_params(adapter, params);
8989 g_slist_free_full(params, g_free);
8991 g_slist_free_full(added_devices, probe_devices);
8994 int btd_adapter_block_address(struct btd_adapter *adapter,
8995 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
8997 struct mgmt_cp_block_device cp;
9000 ba2str(bdaddr, addr);
9001 DBG("hci%u %s", adapter->dev_id, addr);
9003 memset(&cp, 0, sizeof(cp));
9004 bacpy(&cp.addr.bdaddr, bdaddr);
9005 cp.addr.type = bdaddr_type;
9007 if (mgmt_send(adapter->mgmt, MGMT_OP_BLOCK_DEVICE,
9008 adapter->dev_id, sizeof(cp), &cp,
9009 NULL, NULL, NULL) > 0)
9015 int btd_adapter_unblock_address(struct btd_adapter *adapter,
9016 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
9018 struct mgmt_cp_unblock_device cp;
9021 ba2str(bdaddr, addr);
9022 DBG("hci%u %s", adapter->dev_id, addr);
9024 memset(&cp, 0, sizeof(cp));
9025 bacpy(&cp.addr.bdaddr, bdaddr);
9026 cp.addr.type = bdaddr_type;
9028 if (mgmt_send(adapter->mgmt, MGMT_OP_UNBLOCK_DEVICE,
9029 adapter->dev_id, sizeof(cp), &cp,
9030 NULL, NULL, NULL) > 0)
9036 static int clear_blocked(struct btd_adapter *adapter)
9038 return btd_adapter_unblock_address(adapter, BDADDR_ANY, 0);
9041 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
9043 struct btd_adapter_driver *driver = user_data;
9046 if (driver->probe == NULL)
9049 err = driver->probe(adapter);
9051 btd_error(adapter->dev_id, "%s: %s (%d)", driver->name,
9052 strerror(-err), -err);
9056 adapter->drivers = g_slist_prepend(adapter->drivers, driver);
9059 static void load_drivers(struct btd_adapter *adapter)
9063 for (l = adapter_drivers; l; l = l->next)
9064 probe_driver(adapter, l->data);
9067 static void probe_profile(struct btd_profile *profile, void *data)
9069 struct btd_adapter *adapter = data;
9072 if (profile->adapter_probe == NULL)
9075 err = profile->adapter_probe(profile, adapter);
9077 btd_error(adapter->dev_id, "%s: %s (%d)", profile->name,
9078 strerror(-err), -err);
9082 adapter->profiles = g_slist_prepend(adapter->profiles, profile);
9085 void adapter_add_profile(struct btd_adapter *adapter, gpointer p)
9087 struct btd_profile *profile = p;
9089 if (!adapter->initialized)
9092 probe_profile(profile, adapter);
9094 g_slist_foreach(adapter->devices, device_probe_profile, profile);
9097 void adapter_remove_profile(struct btd_adapter *adapter, gpointer p)
9099 struct btd_profile *profile = p;
9101 if (!adapter->initialized)
9104 if (profile->device_remove)
9105 g_slist_foreach(adapter->devices, device_remove_profile, p);
9107 adapter->profiles = g_slist_remove(adapter->profiles, profile);
9109 if (profile->adapter_remove)
9110 profile->adapter_remove(profile, adapter);
9113 static void adapter_add_connection(struct btd_adapter *adapter,
9114 struct btd_device *device,
9115 uint8_t bdaddr_type)
9117 device_add_connection(device, bdaddr_type);
9119 if (g_slist_find(adapter->connections, device)) {
9120 btd_error(adapter->dev_id,
9121 "Device is already marked as connected");
9125 adapter->connections = g_slist_append(adapter->connections, device);
9128 static void get_connections_complete(uint8_t status, uint16_t length,
9129 const void *param, void *user_data)
9131 struct btd_adapter *adapter = user_data;
9132 const struct mgmt_rp_get_connections *rp = param;
9133 uint16_t i, conn_count;
9135 if (status != MGMT_STATUS_SUCCESS) {
9136 btd_error(adapter->dev_id,
9137 "Failed to get connections: %s (0x%02x)",
9138 mgmt_errstr(status), status);
9142 if (length < sizeof(*rp)) {
9143 btd_error(adapter->dev_id,
9144 "Wrong size of get connections response");
9148 conn_count = btohs(rp->conn_count);
9150 DBG("Connection count: %d", conn_count);
9152 if (conn_count * sizeof(struct mgmt_addr_info) +
9153 sizeof(*rp) != length) {
9154 btd_error(adapter->dev_id,
9155 "Incorrect packet size for get connections response");
9159 for (i = 0; i < conn_count; i++) {
9160 const struct mgmt_addr_info *addr = &rp->addr[i];
9161 struct btd_device *device;
9164 ba2str(&addr->bdaddr, address);
9165 DBG("Adding existing connection to %s", address);
9167 device = btd_adapter_get_device(adapter, &addr->bdaddr,
9170 adapter_add_connection(adapter, device, addr->type);
9174 static void load_connections(struct btd_adapter *adapter)
9176 DBG("sending get connections command for index %u", adapter->dev_id);
9178 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_CONNECTIONS,
9179 adapter->dev_id, 0, NULL,
9180 get_connections_complete, adapter, NULL) > 0)
9183 btd_error(adapter->dev_id, "Failed to get connections for index %u",
9187 bool btd_adapter_get_pairable(struct btd_adapter *adapter)
9189 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
9195 bool btd_adapter_get_powered(struct btd_adapter *adapter)
9197 if (adapter->current_settings & MGMT_SETTING_POWERED)
9203 bool btd_adapter_get_connectable(struct btd_adapter *adapter)
9205 if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
9211 bool btd_adapter_get_discoverable(struct btd_adapter *adapter)
9213 if (adapter->current_settings & MGMT_SETTING_DISCOVERABLE)
9219 bool btd_adapter_get_bredr(struct btd_adapter *adapter)
9221 if (adapter->current_settings & MGMT_SETTING_BREDR)
9227 struct btd_gatt_database *btd_adapter_get_database(struct btd_adapter *adapter)
9232 return adapter->database;
9235 uint32_t btd_adapter_get_class(struct btd_adapter *adapter)
9237 return adapter->dev_class;
9240 const char *btd_adapter_get_name(struct btd_adapter *adapter)
9242 if (adapter->stored_alias)
9243 return adapter->stored_alias;
9245 if (adapter->system_name)
9246 return adapter->system_name;
9251 int adapter_connect_list_add(struct btd_adapter *adapter,
9252 struct btd_device *device)
9255 * If the adapter->connect_le device is getting added back to
9256 * the connect list it probably means that the connect attempt
9257 * failed and hence we should clear this pointer
9259 if (device == adapter->connect_le)
9260 adapter->connect_le = NULL;
9263 * If kernel background scanning is supported then the
9264 * adapter_auto_connect_add() function is used to maintain what to
9267 if (kernel_conn_control)
9270 if (g_slist_find(adapter->connect_list, device)) {
9271 DBG("ignoring already added device %s",
9272 device_get_path(device));
9276 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
9277 btd_error(adapter->dev_id,
9278 "Can't add %s to non-LE capable adapter connect list",
9279 device_get_path(device));
9283 adapter->connect_list = g_slist_append(adapter->connect_list, device);
9284 DBG("%s added to %s's connect_list", device_get_path(device),
9285 adapter->system_name);
9288 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
9291 trigger_passive_scanning(adapter);
9296 void adapter_connect_list_remove(struct btd_adapter *adapter,
9297 struct btd_device *device)
9300 * If the adapter->connect_le device is being removed from the
9301 * connect list it means the connection was successful and hence
9302 * the pointer should be cleared
9304 if (device == adapter->connect_le)
9305 adapter->connect_le = NULL;
9307 if (kernel_conn_control)
9310 if (!g_slist_find(adapter->connect_list, device)) {
9311 DBG("device %s is not on the list, ignoring",
9312 device_get_path(device));
9316 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
9317 DBG("%s removed from %s's connect_list", device_get_path(device),
9318 adapter->system_name);
9320 if (!adapter->connect_list) {
9321 stop_passive_scanning(adapter);
9325 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
9328 trigger_passive_scanning(adapter);
9331 static void add_whitelist_complete(uint8_t status, uint16_t length,
9332 const void *param, void *user_data)
9334 const struct mgmt_rp_add_device *rp = param;
9335 struct btd_adapter *adapter = user_data;
9336 struct btd_device *dev;
9339 if (length < sizeof(*rp)) {
9340 btd_error(adapter->dev_id,
9341 "Too small Add Device complete event");
9345 ba2str(&rp->addr.bdaddr, addr);
9347 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
9350 btd_error(adapter->dev_id,
9351 "Add Device complete for unknown device %s", addr);
9355 if (status != MGMT_STATUS_SUCCESS) {
9356 btd_error(adapter->dev_id,
9357 "Failed to add device %s: %s (0x%02x)",
9358 addr, mgmt_errstr(status), status);
9362 DBG("%s added to kernel whitelist", addr);
9365 void adapter_whitelist_add(struct btd_adapter *adapter, struct btd_device *dev)
9367 struct mgmt_cp_add_device cp;
9369 if (!kernel_conn_control)
9372 memset(&cp, 0, sizeof(cp));
9373 bacpy(&cp.addr.bdaddr, device_get_address(dev));
9374 cp.addr.type = BDADDR_BREDR;
9377 mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
9378 adapter->dev_id, sizeof(cp), &cp,
9379 add_whitelist_complete, adapter, NULL);
9382 static void remove_whitelist_complete(uint8_t status, uint16_t length,
9383 const void *param, void *user_data)
9385 const struct mgmt_rp_remove_device *rp = param;
9388 if (length < sizeof(*rp)) {
9389 error("Too small Remove Device complete event");
9393 ba2str(&rp->addr.bdaddr, addr);
9395 if (status != MGMT_STATUS_SUCCESS) {
9396 error("Failed to remove device %s: %s (0x%02x)",
9397 addr, mgmt_errstr(status), status);
9401 DBG("%s removed from kernel whitelist", addr);
9404 void adapter_whitelist_remove(struct btd_adapter *adapter, struct btd_device *dev)
9406 struct mgmt_cp_remove_device cp;
9408 if (!kernel_conn_control)
9411 memset(&cp, 0, sizeof(cp));
9412 bacpy(&cp.addr.bdaddr, device_get_address(dev));
9413 cp.addr.type = BDADDR_BREDR;
9415 mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
9416 adapter->dev_id, sizeof(cp), &cp,
9417 remove_whitelist_complete, adapter, NULL);
9420 static void add_device_complete(uint8_t status, uint16_t length,
9421 const void *param, void *user_data)
9423 const struct mgmt_rp_add_device *rp = param;
9424 struct btd_adapter *adapter = user_data;
9425 struct btd_device *dev;
9428 if (length < sizeof(*rp)) {
9429 btd_error(adapter->dev_id,
9430 "Too small Add Device complete event");
9434 ba2str(&rp->addr.bdaddr, addr);
9436 dev = btd_adapter_find_device(adapter, &rp->addr.bdaddr,
9439 btd_error(adapter->dev_id,
9440 "Add Device complete for unknown device %s", addr);
9444 if (status != MGMT_STATUS_SUCCESS) {
9445 btd_error(adapter->dev_id,
9446 "Failed to add device %s (%u): %s (0x%02x)",
9447 addr, rp->addr.type, mgmt_errstr(status), status);
9448 adapter->connect_list = g_slist_remove(adapter->connect_list,
9453 DBG("%s (%u) added to kernel connect list", addr, rp->addr.type);
9456 void adapter_auto_connect_add(struct btd_adapter *adapter,
9457 struct btd_device *device)
9459 struct mgmt_cp_add_device cp;
9460 const bdaddr_t *bdaddr;
9461 uint8_t bdaddr_type;
9464 if (!kernel_conn_control)
9467 if (g_slist_find(adapter->connect_list, device)) {
9468 DBG("ignoring already added device %s",
9469 device_get_path(device));
9473 bdaddr = device_get_address(device);
9474 bdaddr_type = btd_device_get_bdaddr_type(device);
9476 if (bdaddr_type == BDADDR_BREDR) {
9477 DBG("auto-connection feature is not avaiable for BR/EDR");
9481 memset(&cp, 0, sizeof(cp));
9482 bacpy(&cp.addr.bdaddr, bdaddr);
9483 cp.addr.type = bdaddr_type;
9486 id = mgmt_send(adapter->mgmt, MGMT_OP_ADD_DEVICE,
9487 adapter->dev_id, sizeof(cp), &cp, add_device_complete,
9492 adapter->connect_list = g_slist_append(adapter->connect_list, device);
9495 static void remove_device_complete(uint8_t status, uint16_t length,
9496 const void *param, void *user_data)
9498 const struct mgmt_rp_remove_device *rp = param;
9501 if (length < sizeof(*rp)) {
9502 error("Too small Remove Device complete event");
9506 ba2str(&rp->addr.bdaddr, addr);
9508 if (status != MGMT_STATUS_SUCCESS) {
9509 error("Failed to remove device %s (%u): %s (0x%02x)",
9510 addr, rp->addr.type, mgmt_errstr(status), status);
9514 DBG("%s (%u) removed from kernel connect list", addr, rp->addr.type);
9517 void adapter_auto_connect_remove(struct btd_adapter *adapter,
9518 struct btd_device *device)
9520 struct mgmt_cp_remove_device cp;
9521 const bdaddr_t *bdaddr;
9522 uint8_t bdaddr_type;
9525 if (!kernel_conn_control)
9528 if (!g_slist_find(adapter->connect_list, device)) {
9529 DBG("ignoring not added device %s", device_get_path(device));
9533 bdaddr = device_get_address(device);
9534 bdaddr_type = btd_device_get_bdaddr_type(device);
9536 if (bdaddr_type == BDADDR_BREDR) {
9537 DBG("auto-connection feature is not avaiable for BR/EDR");
9541 memset(&cp, 0, sizeof(cp));
9542 bacpy(&cp.addr.bdaddr, bdaddr);
9543 cp.addr.type = bdaddr_type;
9545 id = mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
9546 adapter->dev_id, sizeof(cp), &cp,
9547 remove_device_complete, adapter, NULL);
9551 adapter->connect_list = g_slist_remove(adapter->connect_list, device);
9554 #if defined (TIZEN_FEATURE_BLUEZ_MODIFY)
9555 static void get_phy_configuration_resp(uint8_t status, uint16_t len, const void *param,
9558 uint32_t supported_phys;
9559 uint32_t configurable_phys;
9560 uint32_t selected_phys;
9562 const struct mgmt_rp_get_phy_confguration *rp = param;
9563 struct btd_adapter *adapter = user_data;
9565 if (status != MGMT_STATUS_SUCCESS) {
9566 error("Get PHY Configuration failed with status 0x%02x (%s)",
9567 status, mgmt_errstr(status));
9571 if (len < sizeof(*rp)) {
9572 error("Too small get-phy reply (%u bytes)", len);
9576 supported_phys = get_le32(&rp->supported_phys);
9577 configurable_phys = get_le32(&rp-> configurable_phys);
9578 selected_phys = get_le16(&rp->selected_phys);
9580 DBG("Supported phys: [0x%x]", supported_phys);
9581 DBG("Configurable phys: [0x%x]", configurable_phys);
9582 DBG("Selected phys: [0x%x]", selected_phys);
9584 if (adapter->supported_settings & MGMT_SETTING_LE) {
9585 if ((supported_phys & MGMT_PHY_LE_2M_TX) &&
9586 (supported_phys & MGMT_PHY_LE_2M_RX)) {
9587 DBG("Adapter supports LE 2M PHY");
9588 adapter->le_2m_phy_supported = TRUE;
9590 DBG("Adapter does not support LE 2M PHY");
9592 if ((supported_phys & MGMT_PHY_LE_CODED_TX) &&
9593 (supported_phys & MGMT_PHY_LE_CODED_RX)) {
9594 adapter->le_coded_phy_supported = TRUE;
9595 DBG("Adapter supports LE CODED PHY");
9597 DBG("Adapter does not support LE CODED PHY");
9600 /* Emit Property Changed Signal */
9601 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9602 ADAPTER_INTERFACE, "SupportedLEFeatures");
9607 static void adapter_start(struct btd_adapter *adapter)
9610 #if defined(TIZEN_FEATURE_BLUEZ_MODIFY) && !defined(__SPRD_PATCH__)
9611 if (adapter_le_read_ble_feature_info())
9612 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9613 ADAPTER_INTERFACE, "SupportedLEFeatures");
9614 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
9616 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9617 ADAPTER_INTERFACE, "SupportedLEFeatures");
9620 adapter_get_adv_tx_power(adapter);
9622 /* By default enable offloading for testing, this should be modified */
9623 if (adapter_le_is_supported_offloading())
9624 adapter_le_enable_offloading(TRUE);
9627 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
9628 g_dbus_emit_property_changed(dbus_conn, adapter->path,
9629 ADAPTER_INTERFACE, "Powered");
9631 g_dbus_emit_property_changed_full(dbus_conn, adapter->path,
9632 ADAPTER_INTERFACE, "Powered", 1);
9635 DBG("adapter %s has been enabled", adapter->path);
9637 trigger_passive_scanning(adapter);
9640 static void reply_pending_requests(struct btd_adapter *adapter)
9647 /* pending bonding */
9648 for (l = adapter->devices; l; l = l->next) {
9649 struct btd_device *device = l->data;
9651 if (device_is_bonding(device, NULL))
9652 device_bonding_failed(device,
9653 HCI_OE_USER_ENDED_CONNECTION);
9657 static void remove_driver(gpointer data, gpointer user_data)
9659 struct btd_adapter_driver *driver = data;
9660 struct btd_adapter *adapter = user_data;
9663 driver->remove(adapter);
9666 static void remove_profile(gpointer data, gpointer user_data)
9668 struct btd_profile *profile = data;
9669 struct btd_adapter *adapter = user_data;
9671 if (profile->adapter_remove)
9672 profile->adapter_remove(profile, adapter);
9675 static void unload_drivers(struct btd_adapter *adapter)
9677 g_slist_foreach(adapter->drivers, remove_driver, adapter);
9678 g_slist_free(adapter->drivers);
9679 adapter->drivers = NULL;
9681 g_slist_foreach(adapter->profiles, remove_profile, adapter);
9682 g_slist_free(adapter->profiles);
9683 adapter->profiles = NULL;
9686 static void free_service_auth(gpointer data, gpointer user_data)
9688 struct service_auth *auth = data;
9693 static void adapter_free(gpointer user_data)
9695 struct btd_adapter *adapter = user_data;
9699 if (adapter->pairable_timeout_id > 0) {
9700 g_source_remove(adapter->pairable_timeout_id);
9701 adapter->pairable_timeout_id = 0;
9704 if (adapter->passive_scan_timeout > 0) {
9705 g_source_remove(adapter->passive_scan_timeout);
9706 adapter->passive_scan_timeout = 0;
9709 if (adapter->load_ltks_timeout > 0)
9710 g_source_remove(adapter->load_ltks_timeout);
9712 if (adapter->confirm_name_timeout > 0)
9713 g_source_remove(adapter->confirm_name_timeout);
9715 if (adapter->pair_device_timeout > 0)
9716 g_source_remove(adapter->pair_device_timeout);
9718 if (adapter->auth_idle_id)
9719 g_source_remove(adapter->auth_idle_id);
9721 g_queue_foreach(adapter->auths, free_service_auth, NULL);
9722 g_queue_free(adapter->auths);
9725 * Unregister all handlers for this specific index since
9726 * the adapter bound to them is no longer valid.
9728 * This also avoids having multiple instances of the same
9729 * handler in case indexes got removed and re-added.
9731 mgmt_unregister_index(adapter->mgmt, adapter->dev_id);
9734 * Cancel all pending commands for this specific index
9735 * since the adapter bound to them is no longer valid.
9737 mgmt_cancel_index(adapter->mgmt, adapter->dev_id);
9739 mgmt_unref(adapter->mgmt);
9741 sdp_list_free(adapter->services, NULL);
9743 g_slist_free(adapter->connections);
9745 g_free(adapter->path);
9746 g_free(adapter->name);
9747 g_free(adapter->short_name);
9748 g_free(adapter->system_name);
9749 g_free(adapter->stored_alias);
9750 g_free(adapter->current_alias);
9751 free(adapter->modalias);
9755 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
9757 __sync_fetch_and_add(&adapter->ref_count, 1);
9762 void btd_adapter_unref(struct btd_adapter *adapter)
9764 if (__sync_sub_and_fetch(&adapter->ref_count, 1))
9767 if (!adapter->path) {
9768 DBG("Freeing adapter %u", adapter->dev_id);
9770 adapter_free(adapter);
9774 DBG("Freeing adapter %s", adapter->path);
9776 g_dbus_unregister_interface(dbus_conn, adapter->path,
9780 static void convert_names_entry(char *key, char *value, void *user_data)
9782 char *address = user_data;
9784 char filename[PATH_MAX];
9789 if (strchr(key, '#'))
9792 if (bachk(str) != 0)
9795 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", address, str);
9796 create_file(filename, S_IRUSR | S_IWUSR);
9798 key_file = g_key_file_new();
9799 g_key_file_load_from_file(key_file, filename, 0, NULL);
9800 g_key_file_set_string(key_file, "General", "Name", value);
9802 data = g_key_file_to_data(key_file, &length, NULL);
9803 g_file_set_contents(filename, data, length, NULL);
9806 g_key_file_free(key_file);
9809 struct device_converter {
9811 void (*cb)(GKeyFile *key_file, void *value);
9815 static void set_device_type(GKeyFile *key_file, char type)
9818 char *addr_type = NULL;
9825 case BDADDR_LE_PUBLIC:
9827 addr_type = "public";
9829 case BDADDR_LE_RANDOM:
9831 addr_type = "static";
9837 str = g_key_file_get_string(key_file, "General",
9838 "SupportedTechnologies", NULL);
9840 g_key_file_set_string(key_file, "General",
9841 "SupportedTechnologies", techno);
9842 else if (!strstr(str, techno))
9843 g_key_file_set_string(key_file, "General",
9844 "SupportedTechnologies", "BR/EDR;LE");
9849 g_key_file_set_string(key_file, "General", "AddressType",
9853 static void convert_aliases_entry(GKeyFile *key_file, void *value)
9855 g_key_file_set_string(key_file, "General", "Alias", value);
9858 static void convert_trusts_entry(GKeyFile *key_file, void *value)
9860 g_key_file_set_boolean(key_file, "General", "Trusted", TRUE);
9863 static void convert_classes_entry(GKeyFile *key_file, void *value)
9865 g_key_file_set_string(key_file, "General", "Class", value);
9868 static void convert_blocked_entry(GKeyFile *key_file, void *value)
9870 g_key_file_set_boolean(key_file, "General", "Blocked", TRUE);
9873 static void convert_did_entry(GKeyFile *key_file, void *value)
9875 char *vendor_str, *product_str, *version_str;
9878 vendor_str = strchr(value, ' ');
9882 *(vendor_str++) = 0;
9884 if (g_str_equal(value, "FFFF"))
9887 product_str = strchr(vendor_str, ' ');
9891 *(product_str++) = 0;
9893 version_str = strchr(product_str, ' ');
9897 *(version_str++) = 0;
9899 val = (uint16_t) strtol(value, NULL, 16);
9900 g_key_file_set_integer(key_file, "DeviceID", "Source", val);
9902 val = (uint16_t) strtol(vendor_str, NULL, 16);
9903 g_key_file_set_integer(key_file, "DeviceID", "Vendor", val);
9905 val = (uint16_t) strtol(product_str, NULL, 16);
9906 g_key_file_set_integer(key_file, "DeviceID", "Product", val);
9908 val = (uint16_t) strtol(version_str, NULL, 16);
9909 g_key_file_set_integer(key_file, "DeviceID", "Version", val);
9912 static void convert_linkkey_entry(GKeyFile *key_file, void *value)
9914 char *type_str, *length_str, *str;
9917 type_str = strchr(value, ' ');
9923 length_str = strchr(type_str, ' ');
9927 *(length_str++) = 0;
9929 str = g_strconcat("0x", value, NULL);
9930 g_key_file_set_string(key_file, "LinkKey", "Key", str);
9933 val = strtol(type_str, NULL, 16);
9934 g_key_file_set_integer(key_file, "LinkKey", "Type", val);
9936 val = strtol(length_str, NULL, 16);
9937 g_key_file_set_integer(key_file, "LinkKey", "PINLength", val);
9940 static void convert_ltk_entry(GKeyFile *key_file, void *value)
9942 char *auth_str, *rand_str, *str;
9944 unsigned char auth, master, enc_size;
9945 unsigned short ediv;
9947 auth_str = strchr(value, ' ');
9953 for (i = 0, rand_str = auth_str; i < 4; i++) {
9954 rand_str = strchr(rand_str, ' ');
9955 if (!rand_str || rand_str[1] == '\0')
9961 ret = sscanf(auth_str, " %hhd %hhd %hhd %hd", &auth, &master,
9966 str = g_strconcat("0x", value, NULL);
9967 g_key_file_set_string(key_file, "LongTermKey", "Key", str);
9970 g_key_file_set_integer(key_file, "LongTermKey", "Authenticated", auth);
9971 g_key_file_set_integer(key_file, "LongTermKey", "Master", master);
9972 g_key_file_set_integer(key_file, "LongTermKey", "EncSize", enc_size);
9973 g_key_file_set_integer(key_file, "LongTermKey", "EDiv", ediv);
9975 str = g_strconcat("0x", rand_str, NULL);
9976 g_key_file_set_string(key_file, "LongTermKey", "Rand", str);
9980 static void convert_profiles_entry(GKeyFile *key_file, void *value)
9982 g_strdelimit(value, " ", ';');
9983 g_key_file_set_string(key_file, "General", "Services", value);
9986 static void convert_appearances_entry(GKeyFile *key_file, void *value)
9988 g_key_file_set_string(key_file, "General", "Appearance", value);
9991 static void convert_entry(char *key, char *value, void *user_data)
9993 struct device_converter *converter = user_data;
9994 char type = BDADDR_BREDR;
9995 char filename[PATH_MAX];
10000 if (strchr(key, '#')) {
10002 type = key[18] - '0';
10005 if (bachk(key) != 0)
10008 if (converter->force == FALSE) {
10012 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s",
10013 converter->address, key);
10015 err = stat(filename, &st);
10016 if (err || !S_ISDIR(st.st_mode))
10020 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
10021 converter->address, key);
10023 key_file = g_key_file_new();
10024 g_key_file_load_from_file(key_file, filename, 0, NULL);
10026 set_device_type(key_file, type);
10028 converter->cb(key_file, value);
10030 data = g_key_file_to_data(key_file, &length, NULL);
10032 create_file(filename, S_IRUSR | S_IWUSR);
10033 g_file_set_contents(filename, data, length, NULL);
10038 g_key_file_free(key_file);
10041 static void convert_file(char *file, char *address,
10042 void (*cb)(GKeyFile *key_file, void *value),
10045 char filename[PATH_MAX];
10046 struct device_converter converter;
10048 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", address, file);
10050 converter.address = address;
10052 converter.force = force;
10054 textfile_foreach(filename, convert_entry, &converter);
10057 static gboolean record_has_uuid(const sdp_record_t *rec,
10058 const char *profile_uuid)
10062 for (pat = rec->pattern; pat != NULL; pat = pat->next) {
10066 uuid = bt_uuid2string(pat->data);
10070 ret = strcasecmp(uuid, profile_uuid);
10081 static void store_attribute_uuid(GKeyFile *key_file, uint16_t start,
10082 uint16_t end, char *att_uuid,
10085 char handle[6], uuid_str[33];
10088 switch (uuid.type) {
10090 sprintf(uuid_str, "%4.4X", uuid.value.uuid16);
10093 sprintf(uuid_str, "%8.8X", uuid.value.uuid32);
10096 for (i = 0; i < 16; i++)
10097 sprintf(uuid_str + (i * 2), "%2.2X",
10098 uuid.value.uuid128.data[i]);
10101 uuid_str[0] = '\0';
10104 sprintf(handle, "%hu", start);
10105 g_key_file_set_string(key_file, handle, "UUID", att_uuid);
10106 g_key_file_set_string(key_file, handle, "Value", uuid_str);
10107 g_key_file_set_integer(key_file, handle, "EndGroupHandle", end);
10110 static void store_sdp_record(char *local, char *peer, int handle, char *value)
10112 char filename[PATH_MAX];
10113 GKeyFile *key_file;
10114 char handle_str[11];
10118 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/cache/%s", local, peer);
10120 key_file = g_key_file_new();
10121 g_key_file_load_from_file(key_file, filename, 0, NULL);
10123 sprintf(handle_str, "0x%8.8X", handle);
10124 g_key_file_set_string(key_file, "ServiceRecords", handle_str, value);
10126 data = g_key_file_to_data(key_file, &length, NULL);
10128 create_file(filename, S_IRUSR | S_IWUSR);
10129 g_file_set_contents(filename, data, length, NULL);
10134 g_key_file_free(key_file);
10137 static void convert_sdp_entry(char *key, char *value, void *user_data)
10139 char *src_addr = user_data;
10141 char type = BDADDR_BREDR;
10143 char filename[PATH_MAX];
10144 GKeyFile *key_file;
10148 char *att_uuid, *prim_uuid;
10149 uint16_t start = 0, end = 0, psm = 0;
10154 ret = sscanf(key, "%17s#%hhu#%08X", dst_addr, &type, &handle);
10156 ret = sscanf(key, "%17s#%08X", dst_addr, &handle);
10161 if (bachk(dst_addr) != 0)
10164 /* Check if the device directory has been created as records should
10165 * only be converted for known devices */
10166 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
10168 err = stat(filename, &st);
10169 if (err || !S_ISDIR(st.st_mode))
10172 /* store device records in cache */
10173 store_sdp_record(src_addr, dst_addr, handle, value);
10175 /* Retrieve device record and check if there is an
10176 * attribute entry in it */
10177 sdp_uuid16_create(&uuid, ATT_UUID);
10178 att_uuid = bt_uuid2string(&uuid);
10180 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
10181 prim_uuid = bt_uuid2string(&uuid);
10183 rec = record_from_string(value);
10185 if (record_has_uuid(rec, att_uuid))
10188 /* TODO: Do this through btd_gatt_database */
10189 if (!gatt_parse_record(rec, &uuid, &psm, &start, &end))
10192 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", src_addr,
10195 key_file = g_key_file_new();
10196 g_key_file_load_from_file(key_file, filename, 0, NULL);
10198 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
10200 data = g_key_file_to_data(key_file, &length, NULL);
10202 create_file(filename, S_IRUSR | S_IWUSR);
10203 g_file_set_contents(filename, data, length, NULL);
10207 g_key_file_free(key_file);
10210 sdp_record_free(rec);
10215 static void convert_primaries_entry(char *key, char *value, void *user_data)
10217 char *address = user_data;
10218 int device_type = -1;
10220 char **services, **service, *prim_uuid;
10221 char filename[PATH_MAX];
10222 GKeyFile *key_file;
10224 uint16_t start, end;
10225 char uuid_str[MAX_LEN_UUID_STR + 1];
10229 if (strchr(key, '#')) {
10231 device_type = key[18] - '0';
10234 if (bachk(key) != 0)
10237 services = g_strsplit(value, " ", 0);
10238 if (services == NULL)
10241 sdp_uuid16_create(&uuid, GATT_PRIM_SVC_UUID);
10242 prim_uuid = bt_uuid2string(&uuid);
10244 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/attributes", address,
10246 key_file = g_key_file_new();
10247 g_key_file_load_from_file(key_file, filename, 0, NULL);
10249 for (service = services; *service; service++) {
10250 ret = sscanf(*service, "%04hX#%04hX#%s", &start, &end,
10255 bt_string2uuid(&uuid, uuid_str);
10256 sdp_uuid128_to_uuid(&uuid);
10258 store_attribute_uuid(key_file, start, end, prim_uuid, uuid);
10261 g_strfreev(services);
10263 data = g_key_file_to_data(key_file, &length, NULL);
10267 create_file(filename, S_IRUSR | S_IWUSR);
10268 g_file_set_contents(filename, data, length, NULL);
10270 if (device_type < 0)
10274 g_key_file_free(key_file);
10276 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info", address, key);
10278 key_file = g_key_file_new();
10279 g_key_file_load_from_file(key_file, filename, 0, NULL);
10280 set_device_type(key_file, device_type);
10282 data = g_key_file_to_data(key_file, &length, NULL);
10284 create_file(filename, S_IRUSR | S_IWUSR);
10285 g_file_set_contents(filename, data, length, NULL);
10291 g_key_file_free(key_file);
10294 static void convert_ccc_entry(char *key, char *value, void *user_data)
10296 char *src_addr = user_data;
10298 char type = BDADDR_BREDR;
10301 char filename[PATH_MAX];
10302 GKeyFile *key_file;
10308 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
10312 if (bachk(dst_addr) != 0)
10315 /* Check if the device directory has been created as records should
10316 * only be converted for known devices */
10317 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
10319 err = stat(filename, &st);
10320 if (err || !S_ISDIR(st.st_mode))
10323 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/ccc", src_addr,
10325 key_file = g_key_file_new();
10326 g_key_file_load_from_file(key_file, filename, 0, NULL);
10328 sprintf(group, "%hu", handle);
10329 g_key_file_set_string(key_file, group, "Value", value);
10331 data = g_key_file_to_data(key_file, &length, NULL);
10333 create_file(filename, S_IRUSR | S_IWUSR);
10334 g_file_set_contents(filename, data, length, NULL);
10338 g_key_file_free(key_file);
10341 static void convert_gatt_entry(char *key, char *value, void *user_data)
10343 char *src_addr = user_data;
10345 char type = BDADDR_BREDR;
10348 char filename[PATH_MAX];
10349 GKeyFile *key_file;
10355 ret = sscanf(key, "%17s#%hhu#%04hX", dst_addr, &type, &handle);
10359 if (bachk(dst_addr) != 0)
10362 /* Check if the device directory has been created as records should
10363 * only be converted for known devices */
10364 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, dst_addr);
10366 err = stat(filename, &st);
10367 if (err || !S_ISDIR(st.st_mode))
10370 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/gatt", src_addr,
10372 key_file = g_key_file_new();
10373 g_key_file_load_from_file(key_file, filename, 0, NULL);
10375 sprintf(group, "%hu", handle);
10376 g_key_file_set_string(key_file, group, "Value", value);
10378 data = g_key_file_to_data(key_file, &length, NULL);
10380 create_file(filename, S_IRUSR | S_IWUSR);
10381 g_file_set_contents(filename, data, length, NULL);
10385 g_key_file_free(key_file);
10388 static void convert_proximity_entry(char *key, char *value, void *user_data)
10390 char *src_addr = user_data;
10392 char filename[PATH_MAX];
10393 GKeyFile *key_file;
10399 if (!strchr(key, '#'))
10405 if (bachk(key) != 0)
10408 /* Check if the device directory has been created as records should
10409 * only be converted for known devices */
10410 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s", src_addr, key);
10412 err = stat(filename, &st);
10413 if (err || !S_ISDIR(st.st_mode))
10416 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/proximity", src_addr,
10418 key_file = g_key_file_new();
10419 g_key_file_load_from_file(key_file, filename, 0, NULL);
10421 g_key_file_set_string(key_file, alert, "Level", value);
10423 data = g_key_file_to_data(key_file, &length, NULL);
10425 create_file(filename, S_IRUSR | S_IWUSR);
10426 g_file_set_contents(filename, data, length, NULL);
10430 g_key_file_free(key_file);
10433 static void convert_device_storage(struct btd_adapter *adapter)
10435 char filename[PATH_MAX];
10438 ba2str(&adapter->bdaddr, address);
10440 /* Convert device's name cache */
10441 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
10442 textfile_foreach(filename, convert_names_entry, address);
10444 /* Convert aliases */
10445 convert_file("aliases", address, convert_aliases_entry, TRUE);
10447 /* Convert trusts */
10448 convert_file("trusts", address, convert_trusts_entry, TRUE);
10450 /* Convert blocked */
10451 convert_file("blocked", address, convert_blocked_entry, TRUE);
10453 /* Convert profiles */
10454 convert_file("profiles", address, convert_profiles_entry, TRUE);
10456 /* Convert primaries */
10457 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
10458 textfile_foreach(filename, convert_primaries_entry, address);
10460 /* Convert linkkeys */
10461 convert_file("linkkeys", address, convert_linkkey_entry, TRUE);
10463 /* Convert longtermkeys */
10464 convert_file("longtermkeys", address, convert_ltk_entry, TRUE);
10466 /* Convert classes */
10467 convert_file("classes", address, convert_classes_entry, FALSE);
10469 /* Convert device ids */
10470 convert_file("did", address, convert_did_entry, FALSE);
10473 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
10474 textfile_foreach(filename, convert_sdp_entry, address);
10477 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
10478 textfile_foreach(filename, convert_ccc_entry, address);
10480 /* Convert appearances */
10481 convert_file("appearances", address, convert_appearances_entry, FALSE);
10484 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
10485 textfile_foreach(filename, convert_gatt_entry, address);
10487 /* Convert proximity */
10488 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
10489 textfile_foreach(filename, convert_proximity_entry, address);
10492 static void convert_config(struct btd_adapter *adapter, const char *filename,
10493 GKeyFile *key_file)
10496 char str[MAX_NAME_LENGTH + 1];
10497 char config_path[PATH_MAX];
10503 ba2str(&adapter->bdaddr, address);
10504 snprintf(config_path, PATH_MAX, STORAGEDIR "/%s/config", address);
10506 if (read_pairable_timeout(address, &timeout) == 0)
10507 g_key_file_set_integer(key_file, "General",
10508 "PairableTimeout", timeout);
10510 if (read_discoverable_timeout(address, &timeout) == 0)
10511 g_key_file_set_integer(key_file, "General",
10512 "DiscoverableTimeout", timeout);
10514 if (read_on_mode(address, str, sizeof(str)) == 0) {
10515 mode = get_mode(str);
10516 g_key_file_set_boolean(key_file, "General", "Discoverable",
10517 mode == MODE_DISCOVERABLE);
10520 if (read_local_name(&adapter->bdaddr, str) == 0)
10521 g_key_file_set_string(key_file, "General", "Alias", str);
10523 create_file(filename, S_IRUSR | S_IWUSR);
10525 data = g_key_file_to_data(key_file, &length, NULL);
10526 g_file_set_contents(filename, data, length, NULL);
10530 static void fix_storage(struct btd_adapter *adapter)
10532 char filename[PATH_MAX];
10536 ba2str(&adapter->bdaddr, address);
10538 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/config", address);
10539 converted = textfile_get(filename, "converted");
10545 textfile_del(filename, "converted");
10547 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/names", address);
10548 textfile_del(filename, "converted");
10550 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/aliases", address);
10551 textfile_del(filename, "converted");
10553 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/trusts", address);
10554 textfile_del(filename, "converted");
10556 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/blocked", address);
10557 textfile_del(filename, "converted");
10559 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/profiles", address);
10560 textfile_del(filename, "converted");
10562 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/primaries", address);
10563 textfile_del(filename, "converted");
10565 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/linkkeys", address);
10566 textfile_del(filename, "converted");
10568 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/longtermkeys", address);
10569 textfile_del(filename, "converted");
10571 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/classes", address);
10572 textfile_del(filename, "converted");
10574 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/did", address);
10575 textfile_del(filename, "converted");
10577 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/sdp", address);
10578 textfile_del(filename, "converted");
10580 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/ccc", address);
10581 textfile_del(filename, "converted");
10583 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/appearances", address);
10584 textfile_del(filename, "converted");
10586 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/gatt", address);
10587 textfile_del(filename, "converted");
10589 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/proximity", address);
10590 textfile_del(filename, "converted");
10593 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10594 static bool is_tempfile(const char *filename)
10599 /* tempfile has ^[A-Z0-9]{6}$ suffix (e.g. "settings.1LS4BZ") */
10600 p = strrchr(filename, '.');
10604 if (strlen(++p) != 6)
10607 for (i = 0; i < 6; i++) {
10608 if (isdigit(p[i]) || isupper(p[i]))
10616 static void delete_tempfiles(const char *dirname)
10619 struct dirent *entry;
10620 char filename[PATH_MAX];
10622 dir = opendir(dirname);
10626 while ((entry = readdir(dir)) != NULL) {
10627 if (g_str_equal(entry->d_name, ".") || g_str_equal(entry->d_name, ".."))
10630 if (entry->d_type == DT_UNKNOWN)
10631 entry->d_type = util_get_dt(dirname, entry->d_name);
10633 snprintf(filename, PATH_MAX, "%s/%s", dirname, entry->d_name);
10635 if (entry->d_type == DT_DIR) {
10636 delete_tempfiles(filename);
10637 } else if (entry->d_type == DT_REG && is_tempfile(entry->d_name)) {
10645 static void load_config(struct btd_adapter *adapter)
10647 GKeyFile *key_file;
10648 char filename[PATH_MAX];
10650 GError *gerr = NULL;
10651 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10655 key_file = g_key_file_new();
10657 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/settings",
10658 btd_adapter_get_storage_dir(adapter));
10660 if (stat(filename, &st) < 0) {
10661 convert_config(adapter, filename, key_file);
10662 convert_device_storage(adapter);
10665 g_key_file_load_from_file(key_file, filename, 0, NULL);
10668 adapter->stored_alias = g_key_file_get_string(key_file, "General",
10670 if (!adapter->stored_alias) {
10672 adapter->stored_alias = g_key_file_get_string(key_file,
10673 "General", "Name", NULL);
10676 /* Get pairable timeout */
10677 adapter->pairable_timeout = g_key_file_get_integer(key_file, "General",
10678 "PairableTimeout", &gerr);
10680 adapter->pairable_timeout = main_opts.pairto;
10681 g_error_free(gerr);
10685 /* Get discoverable mode */
10686 adapter->stored_discoverable = g_key_file_get_boolean(key_file,
10687 "General", "Discoverable", &gerr);
10689 adapter->stored_discoverable = false;
10690 g_error_free(gerr);
10694 /* Get discoverable timeout */
10695 adapter->discoverable_timeout = g_key_file_get_integer(key_file,
10696 "General", "DiscoverableTimeout", &gerr);
10698 adapter->discoverable_timeout = main_opts.discovto;
10699 g_error_free(gerr);
10703 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10704 /* Get A2DP Role */
10705 str = g_key_file_get_string(key_file, "General", "DefaultA2DPRole", &gerr);
10706 if (gerr || !str) {
10707 if (main_opts.default_a2dp_role_sink) {
10708 DBG("Default A2DP role is sink");
10709 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
10711 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
10713 g_error_free(gerr);
10716 if (g_strcmp0(str, "sink") == 0)
10717 adapter->a2dp_role = BLUETOOTH_A2DP_SINK_ROLE;
10718 else if (g_strcmp0(str, "source") == 0)
10719 adapter->a2dp_role = BLUETOOTH_A2DP_SOURCE_ROLE;
10723 g_key_file_free(key_file);
10726 static struct btd_adapter *btd_adapter_new(uint16_t index)
10728 struct btd_adapter *adapter;
10729 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10730 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
10731 DBusConnection *conn = btd_get_dbus_connection();
10732 DBusMessage *msg = NULL;
10733 DBusMessage *reply = NULL;
10734 int charging_state = 0;
10735 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
10738 adapter = g_try_new0(struct btd_adapter, 1);
10742 adapter->dev_id = index;
10743 adapter->mgmt = mgmt_ref(mgmt_master);
10744 adapter->pincode_requested = false;
10747 * Setup default configuration values. These are either adapter
10748 * defaults or from a system wide configuration file.
10750 * Some value might be overwritten later on by adapter specific
10751 * configuration. This is to make sure that sane defaults are
10754 adapter->system_name = g_strdup(main_opts.name);
10755 adapter->major_class = (main_opts.class & 0x001f00) >> 8;
10756 adapter->minor_class = (main_opts.class & 0x0000fc) >> 2;
10757 adapter->modalias = bt_modalias(main_opts.did_source,
10758 main_opts.did_vendor,
10759 main_opts.did_product,
10760 main_opts.did_version);
10761 adapter->discoverable_timeout = main_opts.discovto;
10762 adapter->pairable_timeout = main_opts.pairto;
10763 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10764 adapter->advertising = FALSE;
10767 DBG("System name: %s", adapter->system_name);
10768 DBG("Major class: %u", adapter->major_class);
10769 DBG("Minor class: %u", adapter->minor_class);
10770 DBG("Modalias: %s", adapter->modalias);
10771 DBG("Discoverable timeout: %u seconds", adapter->discoverable_timeout);
10772 DBG("Pairable timeout: %u seconds", adapter->pairable_timeout);
10773 adapter->auths = g_queue_new();
10775 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10776 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
10777 adapter->charging_watch = g_dbus_add_signal_watch(conn, DEVICED_DEST,
10778 DEVICED_BATT_OBJECT_PATH,
10779 DEVICED_BATT_INTERFACE, "ChargerType",
10780 charging_state_changed, adapter, NULL);
10781 if (adapter->charging_watch == 0)
10782 error("Cannot add signal watch for ChargerType");
10784 msg = dbus_message_new_method_call(DEVICED_DEST,
10785 DEVICED_BATT_OBJECT_PATH,
10786 DEVICED_BATT_INTERFACE, "ChargerType");
10788 reply = dbus_connection_send_with_reply_and_block(conn,
10791 if (dbus_message_get_args(reply, NULL,
10792 DBUS_TYPE_INT32, &charging_state,
10793 DBUS_TYPE_INVALID) == TRUE) {
10794 set_charging_state(adapter, charging_state);
10796 dbus_message_unref(reply);
10798 error("Reply is NULL");
10800 dbus_message_unref(msg);
10802 error("Unable to create dbus message for charging state");
10804 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
10807 return btd_adapter_ref(adapter);
10810 static void adapter_remove(struct btd_adapter *adapter)
10813 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10814 struct gatt_db *db;
10817 DBG("Removing adapter %s", adapter->path);
10819 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10820 #ifdef TIZEN_FEATURE_BLUEZ_BATTERY_WATCH
10821 if (adapter->charging_watch > 0) {
10822 g_dbus_remove_watch(btd_get_dbus_connection(),
10823 adapter->charging_watch);
10824 adapter->charging_watch = 0;
10827 if (adapter->charging_timeout) {
10828 g_source_remove(adapter->charging_timeout);
10829 adapter->charging_timeout = 0;
10831 #endif /* TIZEN_FEATURE_BLUEZ_BATTERY_WATCH */
10834 if (adapter->discovery_idle_timeout > 0) {
10835 g_source_remove(adapter->discovery_idle_timeout);
10836 adapter->discovery_idle_timeout = 0;
10839 if (adapter->temp_devices_timeout > 0) {
10840 g_source_remove(adapter->temp_devices_timeout);
10841 adapter->temp_devices_timeout = 0;
10844 discovery_cleanup(adapter);
10846 g_slist_free(adapter->connect_list);
10847 adapter->connect_list = NULL;
10849 for (l = adapter->devices; l; l = l->next)
10850 device_remove(l->data, FALSE);
10852 g_slist_free(adapter->devices);
10853 adapter->devices = NULL;
10855 discovery_cleanup(adapter);
10857 unload_drivers(adapter);
10859 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
10860 db = btd_gatt_database_get_db(adapter->database);
10861 gatt_db_unregister(db, adapter->db_id);
10862 adapter->db_id = 0;
10864 btd_gatt_database_destroy(adapter->database);
10865 adapter->database = NULL;
10867 btd_adapter_gatt_server_stop(adapter);
10869 btd_adv_manager_destroy(adapter->adv_manager);
10870 adapter->adv_manager = NULL;
10872 g_slist_free(adapter->pin_callbacks);
10873 adapter->pin_callbacks = NULL;
10875 g_slist_free(adapter->msd_callbacks);
10876 adapter->msd_callbacks = NULL;
10879 const char *adapter_get_path(struct btd_adapter *adapter)
10884 return adapter->path;
10887 const bdaddr_t *btd_adapter_get_address(struct btd_adapter *adapter)
10889 return &adapter->bdaddr;
10892 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
10893 const bdaddr_t *btd_adapter_get_le_address(struct btd_adapter *adapter)
10895 if (adapter->current_settings & MGMT_SETTING_PRIVACY)
10896 return &adapter->rpa;
10897 else if (adapter->le_static_addr.b[5] != 0)
10898 return &adapter->le_static_addr;
10900 return &adapter->bdaddr;
10903 uint8_t btd_adapter_get_le_address_type(struct btd_adapter * adapter)
10905 if (adapter->current_settings & MGMT_SETTING_PRIVACY ||
10906 adapter->le_static_addr.b[5] != 0)
10907 return BDADDR_LE_RANDOM;
10909 return BDADDR_LE_PUBLIC;
10913 static gboolean confirm_name_timeout(gpointer user_data)
10915 struct btd_adapter *adapter = user_data;
10917 btd_error(adapter->dev_id, "Confirm name timed out for hci%u",
10920 adapter->confirm_name_timeout = 0;
10922 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
10923 adapter->confirm_name_id = 0;
10928 static void confirm_name_complete(uint8_t status, uint16_t length,
10929 const void *param, void *user_data)
10931 struct btd_adapter *adapter = user_data;
10933 if (status != MGMT_STATUS_SUCCESS) {
10934 btd_error(adapter->dev_id,
10935 "Failed to confirm name for hci%u: %s (0x%02x)",
10936 adapter->dev_id, mgmt_errstr(status), status);
10939 adapter->confirm_name_id = 0;
10941 g_source_remove(adapter->confirm_name_timeout);
10942 adapter->confirm_name_timeout = 0;
10944 DBG("Confirm name complete for hci%u", adapter->dev_id);
10947 static void confirm_name(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
10948 uint8_t bdaddr_type, bool name_known)
10950 struct mgmt_cp_confirm_name cp;
10953 ba2str(bdaddr, addr);
10954 DBG("hci%d bdaddr %s name_known %u", adapter->dev_id, addr,
10958 * If the kernel does not answer the confirm name command with
10959 * a command complete or command status in time, this might
10960 * race against another device found event that also requires
10961 * to confirm the name. If there is a pending command, just
10962 * cancel it to be safe here.
10964 if (adapter->confirm_name_id > 0) {
10965 btd_warn(adapter->dev_id,
10966 "Found pending confirm name for hci%u",
10968 mgmt_cancel(adapter->mgmt, adapter->confirm_name_id);
10971 if (adapter->confirm_name_timeout > 0) {
10972 g_source_remove(adapter->confirm_name_timeout);
10973 adapter->confirm_name_timeout = 0;
10976 memset(&cp, 0, sizeof(cp));
10977 bacpy(&cp.addr.bdaddr, bdaddr);
10978 cp.addr.type = bdaddr_type;
10979 cp.name_known = name_known;
10981 adapter->confirm_name_id = mgmt_reply(adapter->mgmt,
10982 MGMT_OP_CONFIRM_NAME,
10983 adapter->dev_id, sizeof(cp), &cp,
10984 confirm_name_complete, adapter, NULL);
10986 if (adapter->confirm_name_id == 0) {
10987 btd_error(adapter->dev_id, "Failed to confirm name for hci%u",
10993 * This timeout handling is needed since the kernel is stupid
10994 * and forgets to send a command complete response. However in
10995 * case of failures it does send a command status.
10997 adapter->confirm_name_timeout = g_timeout_add_seconds(2,
10998 confirm_name_timeout, adapter);
11001 static void adapter_msd_notify(struct btd_adapter *adapter,
11002 struct btd_device *dev,
11005 GSList *cb_l, *cb_next;
11006 GSList *msd_l, *msd_next;
11008 for (cb_l = adapter->msd_callbacks; cb_l != NULL; cb_l = cb_next) {
11009 btd_msd_cb_t cb = cb_l->data;
11011 cb_next = g_slist_next(cb_l);
11013 for (msd_l = msd_list; msd_l != NULL; msd_l = msd_next) {
11014 const struct eir_msd *msd = msd_l->data;
11016 msd_next = g_slist_next(msd_l);
11018 cb(adapter, dev, msd->company, msd->data,
11024 static bool is_filter_match(GSList *discovery_filter, struct eir_data *eir_data,
11028 bool got_match = false;
11030 for (l = discovery_filter; l != NULL && got_match != true;
11031 l = g_slist_next(l)) {
11032 struct watch_client *client = l->data;
11033 struct discovery_filter *item = client->discovery_filter;
11036 * If one of currently running scans is regular scan, then
11037 * return all devices as matches
11044 /* if someone started discovery with empty uuids, he wants all
11045 * devices in given proximity.
11050 for (m = item->uuids; m != NULL && got_match != true;
11051 m = g_slist_next(m)) {
11052 /* m->data contains string representation of
11055 if (g_slist_find_custom(eir_data->services,
11063 /* we have service match, check proximity */
11064 if (item->rssi == DISTANCE_VAL_INVALID ||
11065 item->rssi <= rssi ||
11066 item->pathloss == DISTANCE_VAL_INVALID ||
11067 (eir_data->tx_power != 127 &&
11068 eir_data->tx_power - rssi <= item->pathloss))
11078 static void filter_duplicate_data(void *data, void *user_data)
11080 struct watch_client *client = data;
11081 bool *duplicate = user_data;
11083 if (*duplicate || !client->discovery_filter)
11086 *duplicate = client->discovery_filter->duplicate;
11089 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11090 static void update_found_devices(struct btd_adapter *adapter,
11091 const bdaddr_t *bdaddr,
11092 uint8_t bdaddr_type, int8_t rssi,
11093 bool confirm, bool legacy, uint8_t adv_type,
11094 const uint8_t *data, uint8_t data_len)
11096 static void update_found_devices(struct btd_adapter *adapter,
11097 const bdaddr_t *bdaddr,
11098 uint8_t bdaddr_type, int8_t rssi,
11099 bool confirm, bool legacy,
11100 bool not_connectable,
11101 const uint8_t *data, uint8_t data_len)
11104 struct btd_device *dev;
11105 struct eir_data eir_data;
11106 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11107 bool name_known, discoverable;
11111 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
11112 uint8_t allow_report;
11115 bool duplicate = false;
11117 memset(&eir_data, 0, sizeof(eir_data));
11118 eir_parse(&eir_data, data, data_len);
11119 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11120 if (bdaddr_type == BDADDR_BREDR || adapter->filtered_discovery)
11121 discoverable = true;
11123 discoverable = eir_data.flags & (EIR_LIM_DISC | EIR_GEN_DISC);
11125 ba2str(bdaddr, addr);
11127 #ifdef TIZEN_FEATURE_PLATFROM_SCAN_FILTER
11128 /* Check if the any filter policy */
11129 allow_report = validate_for_filter_policy(adapter, &eir_data, addr);
11130 if (allow_report == NONE_REPORT &&
11131 ((adapter->scan_type == LE_ACTIVE_SCAN && adv_type == ADV_TYPE_SCAN_RESPONSE) ||
11132 adapter->scan_type == LE_PASSIVE_SCAN)) {
11133 eir_data_free(&eir_data);
11137 dev = btd_adapter_find_device(adapter, bdaddr, bdaddr_type);
11140 * If no client has requested discovery or the device is
11141 * not marked as discoverable, then do not create new
11144 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11145 /*DBG("List BREDR:%p LE:%p Discoverable:%d", adapter->discovery_list,
11146 adapter->le_discovery_list, discoverable);*/
11147 if ((adapter->discovery_list == NULL &&
11148 adapter->le_discovery_list == NULL)) {
11149 DBG("discovery list is NULL");
11150 eir_data_free(&eir_data);
11154 if (!adapter->discovery_list || !discoverable) {
11155 eir_data_free(&eir_data);
11160 dev = adapter_create_device(adapter, bdaddr, bdaddr_type);
11164 btd_error(adapter->dev_id,
11165 "Unable to create object for found device %s", addr);
11166 eir_data_free(&eir_data);
11170 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11171 if (device_get_rpa_exist(dev) == true)
11172 bdaddr_type = BDADDR_LE_RANDOM;
11175 device_update_last_seen(dev, bdaddr_type);
11178 * FIXME: We need to check for non-zero flags first because
11179 * older kernels send separate adv_ind and scan_rsp. Newer
11180 * kernels send them merged, so once we know which mgmt version
11181 * supports this we can make the non-zero check conditional.
11183 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11184 if (bdaddr_type == BDADDR_LE_PUBLIC && eir_data.flags &&
11185 !(eir_data.flags & EIR_BREDR_UNSUP)) {
11186 device_set_bredr_support(dev);
11187 /* Update last seen for BR/EDR in case its flag is set */
11188 device_update_last_seen(dev, BDADDR_BREDR);
11191 if (bdaddr_type != BDADDR_BREDR && eir_data.flags &&
11192 !(eir_data.flags & EIR_BREDR_UNSUP)) {
11193 device_set_bredr_support(dev);
11194 /* Update last seen for BR/EDR in case its flag is set */
11195 device_update_last_seen(dev, BDADDR_BREDR);
11199 if (eir_data.name != NULL && eir_data.name_complete)
11200 device_store_cached_name(dev, eir_data.name);
11203 * Only skip devices that are not connected, are temporary and there
11204 * is no active discovery session ongoing.
11206 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11207 if (device_is_temporary(dev) && adapter->discovery_list == NULL &&
11208 adapter->le_discovery_list == NULL) {
11209 DBG("discovery list is NULL");
11210 eir_data_free(&eir_data);
11214 device_set_last_addr_type(dev, bdaddr_type);
11215 device_set_ipsp_connected(dev, FALSE, NULL);
11217 if (!btd_device_is_connected(dev) && (device_is_temporary(dev) &&
11218 !adapter->discovery_list)) {
11219 eir_data_free(&eir_data);
11224 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11225 if (bdaddr_type == BDADDR_BREDR) {
11227 if (adapter->filtered_discovery &&
11228 !is_filter_match(adapter->discovery_list, &eir_data, rssi)) {
11229 eir_data_free(&eir_data);
11233 device_set_legacy(dev, legacy);
11235 if (adapter->filtered_discovery)
11236 device_set_rssi_with_delta(dev, rssi, 0);
11238 device_set_rssi(dev, rssi);
11240 if (eir_data.tx_power != 127)
11241 device_set_tx_power(dev, eir_data.tx_power);
11242 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11246 if (eir_data.appearance != 0)
11247 device_set_appearance(dev, eir_data.appearance);
11249 /* Report an unknown name to the kernel even if there is a short name
11250 * known, but still update the name with the known short name. */
11251 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11252 if (eir_data.name_complete)
11253 name_known = device_name_known(dev);
11255 name_known = false;
11257 name_known = device_name_known(dev);
11260 if (eir_data.name && (eir_data.name_complete || !name_known))
11261 btd_device_device_set_name(dev, eir_data.name);
11263 if (eir_data.class != 0)
11264 device_set_class(dev, eir_data.class);
11266 if (eir_data.did_source || eir_data.did_vendor ||
11267 eir_data.did_product || eir_data.did_version)
11268 btd_device_set_pnpid(dev, eir_data.did_source,
11269 eir_data.did_vendor,
11270 eir_data.did_product,
11271 eir_data.did_version);
11273 device_add_eir_uuids(dev, eir_data.services);
11275 if (adapter->discovery_list)
11276 g_slist_foreach(adapter->discovery_list, filter_duplicate_data,
11278 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11279 if (eir_data.flags != 0)
11280 device_set_remote_feature_flag(dev, eir_data.flags);
11282 if (bdaddr_type == BDADDR_BREDR)
11283 device_set_manufacturer_info(dev, &eir_data);
11285 /* if the application has registered for iBeacon report,
11286 * then send ibeacon report along with advertisement report */
11287 device_set_adv_report_info(dev, (void*)data, data_len, adv_type, rssi);
11291 if (eir_data.msd_list) {
11292 device_set_manufacturer_data(dev, eir_data.msd_list, duplicate);
11293 adapter_msd_notify(adapter, dev, eir_data.msd_list);
11296 if (eir_data.sd_list)
11297 device_set_service_data(dev, eir_data.sd_list, duplicate);
11299 if (eir_data.data_list)
11300 device_set_data(dev, eir_data.data_list, duplicate);
11302 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11303 if (bdaddr_type != BDADDR_BREDR && adv_type != ADV_TYPE_SCAN_RESPONSE) {
11304 device_set_flags(dev, eir_data.flags);
11305 device_set_le_connectable(dev, adv_type);
11308 if (bdaddr_type != BDADDR_BREDR)
11309 device_set_flags(dev, eir_data.flags);
11312 eir_data_free(&eir_data);
11315 * Only if at least one client has requested discovery, maintain
11316 * list of found devices and name confirming for legacy devices.
11317 * Otherwise, this is an event from passive discovery and we
11318 * should check if the device needs connecting to.
11320 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11321 if (!adapter->discovery_list && !adapter->le_discovery_list)
11323 if (!adapter->discovery_list)
11327 if (g_slist_find(adapter->discovery_found, dev))
11331 confirm_name(adapter, bdaddr, bdaddr_type, name_known);
11333 adapter->discovery_found = g_slist_prepend(adapter->discovery_found,
11339 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11340 /* Ignore non-connectable events */
11341 if (not_connectable)
11346 * If we're in the process of stopping passive scanning and
11347 * connecting another (or maybe even the same) LE device just
11350 if (adapter->connect_le)
11354 * If kernel background scan is used then the kernel is
11355 * responsible for connecting.
11357 if (kernel_conn_control)
11361 * If this is an LE device that's not connected and part of the
11362 * connect_list stop passive scanning so that a connection
11363 * attempt to it can be made
11365 if (bdaddr_type != BDADDR_BREDR && !btd_device_is_connected(dev) &&
11366 g_slist_find(adapter->connect_list, dev)) {
11367 adapter->connect_le = dev;
11368 stop_passive_scanning(adapter);
11372 static void device_found_callback(uint16_t index, uint16_t length,
11373 const void *param, void *user_data)
11375 const struct mgmt_ev_device_found *ev = param;
11376 struct btd_adapter *adapter = user_data;
11377 const uint8_t *eir;
11384 if (length < sizeof(*ev)) {
11385 btd_error(adapter->dev_id,
11386 "Too short device found event (%u bytes)", length);
11390 eir_len = btohs(ev->eir_len);
11391 if (length != sizeof(*ev) + eir_len) {
11392 btd_error(adapter->dev_id,
11393 "Device found event size mismatch (%u != %zu)",
11394 length, sizeof(*ev) + eir_len);
11403 flags = btohl(ev->flags);
11405 ba2str(&ev->addr.bdaddr, addr);
11406 DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
11407 index, addr, ev->rssi, flags, eir_len);
11409 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
11410 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
11412 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11413 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
11414 ev->rssi, confirm_name, legacy, 0,
11417 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
11418 ev->rssi, confirm_name, legacy,
11419 flags & MGMT_DEV_FOUND_NOT_CONNECTABLE,
11424 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11425 static void le_device_found_callback(uint16_t index, uint16_t length,
11426 const void *param, void *user_data)
11428 const struct mgmt_ev_le_device_found *ev = param;
11429 struct btd_adapter *adapter = user_data;
11430 const uint8_t *eir;
11437 if (length < sizeof(*ev)) {
11438 error("Too short device found event (%u bytes)", length);
11442 eir_len = btohs(ev->eir_len);
11443 if (length != sizeof(*ev) + eir_len) {
11444 error("Device found event size mismatch (%u != %zu)",
11445 length, sizeof(*ev) + eir_len);
11454 flags = btohl(ev->flags);
11456 ba2str(&ev->addr.bdaddr, addr);
11457 /*DBG("hci%u addr %s, rssi %d flags 0x%04x eir_len %u",
11458 index, addr, ev->rssi, flags, eir_len);*/
11460 confirm_name = (flags & MGMT_DEV_FOUND_CONFIRM_NAME);
11461 legacy = (flags & MGMT_DEV_FOUND_LEGACY_PAIRING);
11463 /*DBG("hci%u addr %s, addr_type %d rssi %d flags 0x%04x eir_len %u confirm_name %d legacy %d, adv_type %02x",
11464 index, addr, ev->addr.type, ev->rssi, flags, eir_len, confirm_name, legacy, ev->adv_type);*/
11466 update_found_devices(adapter, &ev->addr.bdaddr, ev->addr.type,
11467 ev->rssi, confirm_name, legacy, ev->adv_type,
11472 struct agent *adapter_get_agent(struct btd_adapter *adapter)
11474 return agent_get(NULL);
11477 static void adapter_remove_connection(struct btd_adapter *adapter,
11478 struct btd_device *device,
11479 uint8_t bdaddr_type)
11483 if (!g_slist_find(adapter->connections, device)) {
11484 btd_error(adapter->dev_id, "No matching connection for device");
11488 device_remove_connection(device, bdaddr_type);
11490 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11491 if (device_is_authenticating(device, bdaddr_type))
11493 if (device_is_authenticating(device))
11495 device_cancel_authentication(device, TRUE);
11497 /* If another bearer is still connected */
11498 if (btd_device_is_connected(device))
11501 adapter->connections = g_slist_remove(adapter->connections, device);
11502 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11503 DBG("isPaired %d, isBonded %d", device_is_paired(device, bdaddr_type),
11504 device_is_bonded(device, bdaddr_type));
11505 if ((device_is_temporary(device) && !device_is_retrying(device)) ||
11506 (!device_is_bonded(device, bdaddr_type))) {
11508 if (device_is_temporary(device) && !device_is_retrying(device)) {
11510 const char *path = device_get_path(device);
11512 DBG("Removing temporary device %s", path);
11513 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11514 /* device_is_paired is added incase of tempoary bonded
11515 * oop file transfer in that device is not bonded it's paired.
11517 if (!(device_is_bonded(device, bdaddr_type) ||
11518 device_is_paired(device, bdaddr_type))) {
11519 DBG("addr type %d, bonded", bdaddr_type);
11523 btd_adapter_unpair_device(adapter, device);
11525 btd_adapter_remove_device(adapter, device);
11530 static void adapter_stop(struct btd_adapter *adapter)
11532 /* check pending requests */
11533 reply_pending_requests(adapter);
11535 cancel_passive_scanning(adapter);
11537 g_slist_free_full(adapter->set_filter_list, discovery_free);
11538 adapter->set_filter_list = NULL;
11540 g_slist_free_full(adapter->discovery_list, discovery_free);
11541 adapter->discovery_list = NULL;
11543 discovery_cleanup(adapter);
11545 adapter->filtered_discovery = false;
11546 adapter->no_scan_restart_delay = false;
11547 g_free(adapter->current_discovery_filter);
11548 adapter->current_discovery_filter = NULL;
11550 adapter->discovering = false;
11552 while (adapter->connections) {
11553 struct btd_device *device = adapter->connections->data;
11554 uint8_t addr_type = btd_device_get_bdaddr_type(device);
11556 adapter_remove_connection(adapter, device, BDADDR_BREDR);
11557 if (addr_type != BDADDR_BREDR)
11558 adapter_remove_connection(adapter, device, addr_type);
11561 g_dbus_emit_property_changed(dbus_conn, adapter->path,
11562 ADAPTER_INTERFACE, "Discovering");
11563 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11564 g_dbus_emit_property_changed(dbus_conn, adapter->path,
11565 ADAPTER_INTERFACE, "LEDiscovering");
11568 if (adapter->dev_class) {
11569 /* the kernel should reset the class of device when powering
11570 * down, but it does not. So force it here ... */
11571 adapter->dev_class = 0;
11572 g_dbus_emit_property_changed(dbus_conn, adapter->path,
11573 ADAPTER_INTERFACE, "Class");
11576 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11577 advertiser_cleanup(adapter);
11579 g_dbus_emit_property_changed(dbus_conn, adapter->path,
11580 ADAPTER_INTERFACE, "Powered");
11582 DBG("adapter %s has been disabled", adapter->path);
11585 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
11587 adapter_drivers = g_slist_append(adapter_drivers, driver);
11589 if (driver->probe == NULL)
11592 adapter_foreach(probe_driver, driver);
11597 static void unload_driver(struct btd_adapter *adapter, gpointer data)
11599 struct btd_adapter_driver *driver = data;
11601 if (driver->remove)
11602 driver->remove(adapter);
11604 adapter->drivers = g_slist_remove(adapter->drivers, data);
11607 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
11609 adapter_drivers = g_slist_remove(adapter_drivers, driver);
11611 adapter_foreach(unload_driver, driver);
11614 static void agent_auth_cb(struct agent *agent, DBusError *derr,
11617 struct btd_adapter *adapter = user_data;
11618 struct service_auth *auth = g_queue_pop_head(adapter->auths);
11621 DBG("No pending authorization");
11625 auth->cb(derr, auth->user_data);
11628 agent_unref(auth->agent);
11632 /* Stop processing if queue is empty */
11633 if (g_queue_is_empty(adapter->auths)) {
11634 if (adapter->auth_idle_id > 0)
11635 g_source_remove(adapter->auth_idle_id);
11639 if (adapter->auth_idle_id > 0)
11642 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
11645 static gboolean process_auth_queue(gpointer user_data)
11647 struct btd_adapter *adapter = user_data;
11650 adapter->auth_idle_id = 0;
11652 dbus_error_init(&err);
11653 dbus_set_error_const(&err, ERROR_INTERFACE ".Rejected", NULL);
11655 while (!g_queue_is_empty(adapter->auths)) {
11656 struct service_auth *auth = adapter->auths->head->data;
11657 struct btd_device *device = auth->device;
11658 const char *dev_path;
11660 /* Wait services to be resolved before asking authorization */
11661 if (auth->svc_id > 0) {
11662 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11663 DBG("Wait services to be resolved before asking authorization");
11668 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
11669 if (device_is_trusted(device) == TRUE) {
11671 if (device_is_trusted(device) == TRUE
11672 || device_is_profile_trusted(device, auth->uuid)
11673 || main_opts.pin_code) {
11674 /* In headless device(pin_code is existing),
11675 no need to request to agent */
11677 auth->cb(NULL, auth->user_data);
11681 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
11682 /* If Profile is Blocked, Simply reject Authorization*/
11683 if (device_is_profile_blocked(device, auth->uuid) == TRUE) {
11684 auth->cb(&err, auth->user_data);
11689 /* If agent is set authorization is already ongoing */
11693 auth->agent = agent_get(NULL);
11694 if (auth->agent == NULL) {
11695 btd_warn(adapter->dev_id,
11696 "Authentication attempt without agent");
11697 auth->cb(&err, auth->user_data);
11701 dev_path = device_get_path(device);
11703 if (agent_authorize_service(auth->agent, dev_path, auth->uuid,
11704 agent_auth_cb, adapter, NULL) < 0) {
11705 auth->cb(&err, auth->user_data);
11713 agent_unref(auth->agent);
11717 g_queue_pop_head(adapter->auths);
11720 dbus_error_free(&err);
11725 static void svc_complete(struct btd_device *dev, int err, void *user_data)
11727 struct service_auth *auth = user_data;
11728 struct btd_adapter *adapter = auth->adapter;
11732 if (adapter->auth_idle_id != 0)
11735 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
11738 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
11740 adapter_authorize_type check_for_connection,
11741 service_auth_cb cb, void *user_data)
11743 struct service_auth *auth;
11744 struct btd_device *device;
11745 static guint id = 0;
11747 device = btd_adapter_find_device(adapter, dst, BDADDR_BREDR);
11751 if (device_is_disconnecting(device)) {
11752 DBG("Authorization request while disconnecting");
11756 /* Device connected? */
11757 if (check_for_connection && !g_slist_find(adapter->connections, device))
11758 btd_error(adapter->dev_id,
11759 "Authorization request for non-connected device!?");
11761 auth = g_try_new0(struct service_auth, 1);
11766 auth->user_data = user_data;
11768 auth->device = device;
11769 auth->adapter = adapter;
11771 if (check_for_connection)
11772 auth->svc_id = device_wait_for_svc_complete(device, svc_complete, auth);
11774 if (adapter->auth_idle_id == 0)
11775 adapter->auth_idle_id = g_idle_add(process_auth_queue, adapter);
11778 g_queue_push_tail(adapter->auths, auth);
11783 guint btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
11784 const char *uuid, service_auth_cb cb,
11787 struct btd_adapter *adapter;
11790 if (bacmp(src, BDADDR_ANY) != 0) {
11791 adapter = adapter_find(src);
11795 return adapter_authorize(adapter, dst, uuid,
11796 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
11799 for (l = adapters; l != NULL; l = g_slist_next(l)) {
11804 id = adapter_authorize(adapter, dst, uuid,
11805 ADAPTER_AUTHORIZE_CHECK_CONNECTED, cb, user_data);
11813 guint btd_request_authorization_cable_configured(const bdaddr_t *src, const bdaddr_t *dst,
11814 const char *uuid, service_auth_cb cb,
11817 struct btd_adapter *adapter;
11819 if (bacmp(src, BDADDR_ANY) == 0)
11822 adapter = adapter_find(src);
11826 return adapter_authorize(adapter, dst, uuid,
11827 ADAPTER_AUTHORIZE_DISCONNECTED, cb, user_data);
11830 static struct service_auth *find_authorization(guint id)
11835 for (l = adapters; l != NULL; l = g_slist_next(l)) {
11836 struct btd_adapter *adapter = l->data;
11838 for (l2 = adapter->auths->head; l2 != NULL; l2 = l2->next) {
11839 struct service_auth *auth = l2->data;
11841 if (auth->id == id)
11849 int btd_cancel_authorization(guint id)
11851 struct service_auth *auth;
11853 auth = find_authorization(id);
11857 if (auth->svc_id > 0)
11858 device_remove_svc_complete_callback(auth->device,
11861 g_queue_remove(auth->adapter->auths, auth);
11864 agent_cancel(auth->agent);
11865 agent_unref(auth->agent);
11873 int btd_adapter_restore_powered(struct btd_adapter *adapter)
11875 if (adapter->current_settings & MGMT_SETTING_POWERED)
11878 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
11883 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
11884 btd_adapter_pin_cb_t cb)
11886 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
11889 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
11890 btd_adapter_pin_cb_t cb)
11892 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
11895 void btd_adapter_unregister_msd_cb(struct btd_adapter *adapter,
11898 adapter->msd_callbacks = g_slist_remove(adapter->msd_callbacks, cb);
11901 void btd_adapter_register_msd_cb(struct btd_adapter *adapter,
11904 adapter->msd_callbacks = g_slist_prepend(adapter->msd_callbacks, cb);
11907 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
11910 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
11913 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, enable ? 0x01 : 0x00);
11918 int btd_adapter_read_clock(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
11919 int which, int timeout, uint32_t *clock,
11920 uint16_t *accuracy)
11922 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
11928 int btd_adapter_remove_bonding(struct btd_adapter *adapter,
11929 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
11931 struct mgmt_cp_unpair_device cp;
11933 memset(&cp, 0, sizeof(cp));
11934 bacpy(&cp.addr.bdaddr, bdaddr);
11935 cp.addr.type = bdaddr_type;
11938 if (mgmt_send(adapter->mgmt, MGMT_OP_UNPAIR_DEVICE,
11939 adapter->dev_id, sizeof(cp), &cp,
11940 NULL, NULL, NULL) > 0)
11946 static void pincode_reply_complete(uint8_t status, uint16_t length,
11947 const void *param, void *user_data)
11949 struct btd_device *device = user_data;
11951 /* If the MGMT_OP_PIN_CODE_REPLY command is acknowledged, move the
11952 * starting time to that point. This give a better sense of time
11953 * evaluating the pincode. */
11954 device_bonding_restart_timer(device);
11957 int btd_adapter_pincode_reply(struct btd_adapter *adapter,
11958 const bdaddr_t *bdaddr,
11959 const char *pin, size_t pin_len)
11961 struct btd_device *device;
11965 ba2str(bdaddr, addr);
11966 DBG("hci%u addr %s pinlen %zu", adapter->dev_id, addr, pin_len);
11969 struct mgmt_cp_pin_code_neg_reply cp;
11971 memset(&cp, 0, sizeof(cp));
11972 bacpy(&cp.addr.bdaddr, bdaddr);
11973 cp.addr.type = BDADDR_BREDR;
11975 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_NEG_REPLY,
11976 adapter->dev_id, sizeof(cp), &cp,
11979 struct mgmt_cp_pin_code_reply cp;
11984 memset(&cp, 0, sizeof(cp));
11985 bacpy(&cp.addr.bdaddr, bdaddr);
11986 cp.addr.type = BDADDR_BREDR;
11987 cp.pin_len = pin_len;
11988 memcpy(cp.pin_code, pin, pin_len);
11990 /* Since a pincode was requested, update the starting time to
11991 * the point where the pincode is provided. */
11992 device = btd_adapter_find_device(adapter, bdaddr, BDADDR_BREDR);
11993 device_bonding_restart_timer(device);
11995 id = mgmt_reply(adapter->mgmt, MGMT_OP_PIN_CODE_REPLY,
11996 adapter->dev_id, sizeof(cp), &cp,
11997 pincode_reply_complete, device, NULL);
12006 int btd_adapter_confirm_reply(struct btd_adapter *adapter,
12007 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
12010 struct mgmt_cp_user_confirm_reply cp;
12014 ba2str(bdaddr, addr);
12015 DBG("hci%u addr %s success %d", adapter->dev_id, addr, success);
12018 opcode = MGMT_OP_USER_CONFIRM_REPLY;
12020 opcode = MGMT_OP_USER_CONFIRM_NEG_REPLY;
12022 memset(&cp, 0, sizeof(cp));
12023 bacpy(&cp.addr.bdaddr, bdaddr);
12024 cp.addr.type = bdaddr_type;
12026 if (mgmt_reply(adapter->mgmt, opcode, adapter->dev_id, sizeof(cp), &cp,
12027 NULL, NULL, NULL) > 0)
12033 static void user_confirm_request_callback(uint16_t index, uint16_t length,
12034 const void *param, void *user_data)
12036 const struct mgmt_ev_user_confirm_request *ev = param;
12037 struct btd_adapter *adapter = user_data;
12038 struct btd_device *device;
12042 if (length < sizeof(*ev)) {
12043 btd_error(adapter->dev_id,
12044 "Too small user confirm request event");
12048 ba2str(&ev->addr.bdaddr, addr);
12049 DBG("hci%u %s confirm_hint %u", adapter->dev_id, addr,
12051 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
12054 btd_error(adapter->dev_id,
12055 "Unable to get device object for %s", addr);
12059 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12060 device_set_auth_addr_type(device, ev->addr.type);
12062 err = device_confirm_passkey(device, ev->addr.type, btohl(ev->value),
12065 btd_error(adapter->dev_id,
12066 "device_confirm_passkey: %s", strerror(-err));
12067 btd_adapter_confirm_reply(adapter, &ev->addr.bdaddr,
12068 ev->addr.type, FALSE);
12072 int btd_adapter_passkey_reply(struct btd_adapter *adapter,
12073 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
12079 ba2str(bdaddr, addr);
12080 DBG("hci%u addr %s passkey %06u", adapter->dev_id, addr, passkey);
12082 if (passkey == INVALID_PASSKEY) {
12083 struct mgmt_cp_user_passkey_neg_reply cp;
12085 memset(&cp, 0, sizeof(cp));
12086 bacpy(&cp.addr.bdaddr, bdaddr);
12087 cp.addr.type = bdaddr_type;
12089 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_NEG_REPLY,
12090 adapter->dev_id, sizeof(cp), &cp,
12093 struct mgmt_cp_user_passkey_reply cp;
12095 memset(&cp, 0, sizeof(cp));
12096 bacpy(&cp.addr.bdaddr, bdaddr);
12097 cp.addr.type = bdaddr_type;
12098 cp.passkey = htobl(passkey);
12100 id = mgmt_reply(adapter->mgmt, MGMT_OP_USER_PASSKEY_REPLY,
12101 adapter->dev_id, sizeof(cp), &cp,
12111 static void user_passkey_request_callback(uint16_t index, uint16_t length,
12112 const void *param, void *user_data)
12114 const struct mgmt_ev_user_passkey_request *ev = param;
12115 struct btd_adapter *adapter = user_data;
12116 struct btd_device *device;
12120 if (length < sizeof(*ev)) {
12121 btd_error(adapter->dev_id, "Too small passkey request event");
12125 ba2str(&ev->addr.bdaddr, addr);
12126 DBG("hci%u %s", index, addr);
12128 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
12131 btd_error(adapter->dev_id,
12132 "Unable to get device object for %s", addr);
12136 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12137 device_set_auth_addr_type(device, ev->addr.type);
12139 err = device_request_passkey(device, ev->addr.type);
12141 btd_error(adapter->dev_id,
12142 "device_request_passkey: %s", strerror(-err));
12143 btd_adapter_passkey_reply(adapter, &ev->addr.bdaddr,
12144 ev->addr.type, INVALID_PASSKEY);
12148 static void user_passkey_notify_callback(uint16_t index, uint16_t length,
12149 const void *param, void *user_data)
12151 const struct mgmt_ev_passkey_notify *ev = param;
12152 struct btd_adapter *adapter = user_data;
12153 struct btd_device *device;
12158 if (length < sizeof(*ev)) {
12159 btd_error(adapter->dev_id, "Too small passkey notify event");
12163 ba2str(&ev->addr.bdaddr, addr);
12164 DBG("hci%u %s", index, addr);
12166 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
12169 btd_error(adapter->dev_id,
12170 "Unable to get device object for %s", addr);
12174 passkey = get_le32(&ev->passkey);
12176 DBG("passkey %06u entered %u", passkey, ev->entered);
12178 err = device_notify_passkey(device, ev->addr.type, passkey,
12181 btd_error(adapter->dev_id,
12182 "device_notify_passkey: %s", strerror(-err));
12185 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12186 static void rssi_alert_callback(uint16_t index, uint16_t length,
12187 const void *param, void *user_data)
12189 const struct mgmt_ev_vendor_specific_rssi_alert *ev = param;
12190 struct btd_adapter *adapter = user_data;
12192 char *bt_addr = NULL;
12193 int link_type = -1;
12194 int alert_type = -1;
12197 if (length < sizeof(*ev)) {
12198 error("Too small rssi alert event");
12202 ba2str(&ev->bdaddr, addr);
12203 DBG("hci%u %s %d", index, addr, ev->link_type);
12204 DBG("RSSI Alert Params [%d %d]", ev->alert_type, ev->rssi_dbm);
12206 bt_addr = (char *)&addr;
12207 link_type = ev->link_type;
12208 alert_type = ev->alert_type;
12209 rssi_dbm = ev->rssi_dbm;
12210 g_dbus_emit_signal(dbus_conn, adapter->path,
12211 ADAPTER_INTERFACE, "RssiAlert",
12212 DBUS_TYPE_STRING, &bt_addr,
12213 DBUS_TYPE_INT32, &link_type,
12214 DBUS_TYPE_INT32, &alert_type,
12215 DBUS_TYPE_INT32, &rssi_dbm,
12216 DBUS_TYPE_INVALID);
12219 static void get_raw_rssi_callback(uint16_t index, uint16_t length,
12220 const void *param, void *user_data)
12222 const struct mgmt_cc_rp_get_raw_rssi *ev = param;
12223 struct btd_adapter *adapter = user_data;
12225 char *bt_addr = NULL;
12226 int link_type = -1;
12229 if (length < sizeof(*ev)) {
12230 error("Too small raw RSSI event");
12234 ba2str(&ev->bt_address, addr);
12235 DBG("hci%u %s", index, addr);
12236 DBG("Raw RSSI Params [%d %d]", ev->link_type, ev->rssi_dbm);
12238 bt_addr = (char *)&addr;
12239 link_type = ev->link_type;
12240 rssi_dbm = ev->rssi_dbm;
12242 g_dbus_emit_signal(dbus_conn, adapter->path,
12243 ADAPTER_INTERFACE, "RawRssi",
12244 DBUS_TYPE_STRING, &bt_addr,
12245 DBUS_TYPE_INT32, &link_type,
12246 DBUS_TYPE_INT32, &rssi_dbm,
12247 DBUS_TYPE_INVALID);
12250 static void rssi_enabled_callback(uint16_t index, uint16_t length,
12251 const void *param, void *user_data)
12253 const struct mgmt_cc_rsp_enable_rssi *ev = param;
12254 struct btd_adapter *adapter = user_data;
12256 char *bt_addr = NULL;
12257 int enabled = TRUE;
12258 int link_type = -1;
12260 if (length < sizeof(*ev)) {
12261 error("Too small rssi enabled event");
12265 ba2str(&ev->bt_address, addr);
12266 DBG("hci%u %s %d", index, addr, ev->link_type);
12267 DBG("RSSI Enabled [%d %d]", ev->le_ext_opcode, ev->status);
12269 bt_addr = (char *)&addr;
12270 link_type = ev->link_type;
12272 g_dbus_emit_signal(dbus_conn, adapter->path,
12273 ADAPTER_INTERFACE, "RssiEnabled",
12274 DBUS_TYPE_STRING, &bt_addr,
12275 DBUS_TYPE_INT32, &link_type,
12276 DBUS_TYPE_BOOLEAN, &enabled,
12277 DBUS_TYPE_INVALID);
12280 static void rssi_disabled_callback(uint16_t index, uint16_t length,
12281 const void *param, void *user_data)
12283 const struct mgmt_cc_rp_disable_rssi *ev = param;
12284 struct btd_adapter *adapter = user_data;
12286 char *bt_addr = NULL;
12287 int disabled = FALSE;
12288 int link_type = -1;
12290 if (length < sizeof(*ev)) {
12291 error("Too small RSSI disabled event");
12295 ba2str(&ev->bt_address, addr);
12296 DBG("hci%u %s %d", index, addr, ev->link_type);
12297 DBG("RSSI Disabled Params [%d %d]", ev->le_ext_opcode, ev->status);
12299 bt_addr = (char *)&addr;
12300 link_type = ev->link_type;
12302 g_dbus_emit_signal(dbus_conn, adapter->path,
12303 ADAPTER_INTERFACE, "RssiEnabled",
12304 DBUS_TYPE_STRING, &bt_addr,
12305 DBUS_TYPE_INT32, &link_type,
12306 DBUS_TYPE_BOOLEAN, &disabled,
12307 DBUS_TYPE_INVALID);
12310 void adapter_check_version(struct btd_adapter *adapter, uint8_t hci_ver)
12316 ver = "Bluetooth 1.0b";
12319 ver = "Bluetooth 1.1";
12322 ver = "Bluetooth 1.2";
12325 ver = "Bluetooth 2.0 + EDR";
12328 ver = "Bluetooth 2.1 + EDR";
12331 ver = "Bluetooth 3.0 + HS";
12334 ver = "Bluetooth 4.0";
12337 ver = "Bluetooth 4.1";
12344 if (adapter->version)
12345 g_free(adapter->version);
12347 adapter->version = g_strdup(ver);
12350 static void hardware_error_callback(uint16_t index, uint16_t length,
12351 const void *param, void *user_data)
12353 const struct mgmt_ev_hardware_error *ev = param;
12354 struct btd_adapter *adapter = user_data;
12356 if (length < sizeof(*ev)) {
12357 error("Too small Hardware error event");
12361 error("Hardware error occurred : %d", ev->error_code);
12362 g_dbus_emit_signal(dbus_conn, adapter->path,
12363 ADAPTER_INTERFACE, "HardwareError",
12364 DBUS_TYPE_INVALID);
12367 static void tx_timeout_error_callback(uint16_t index, uint16_t length,
12368 const void *param, void *user_data)
12370 struct btd_adapter *adapter = user_data;
12372 error("Tx Timeout error occurred");
12373 g_dbus_emit_signal(dbus_conn, adapter->path,
12374 ADAPTER_INTERFACE, "TxTimeoutError",
12375 DBUS_TYPE_INVALID);
12378 static void device_name_update_callback(uint16_t index, uint16_t length,
12379 const void *param, void *user_data)
12381 const struct mgmt_ev_device_name_update *ev = param;
12382 struct btd_adapter *adapter = user_data;
12383 struct btd_device *device;
12385 const uint8_t *eir_name;
12386 struct eir_data eir_data;
12388 if (length < sizeof(*ev)) {
12389 error("Name update error event");
12393 ba2str(&ev->addr.bdaddr, addr);
12394 DBG("hci%u %s", index, addr);
12396 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
12399 error("Unable to get device object for %s", addr);
12403 if (ev->eir_len == 0)
12406 eir_name = ev->eir;
12408 memset(&eir_data, 0, sizeof(eir_data));
12409 eir_parse(&eir_data, eir_name, ev->eir_len);
12412 btd_device_device_set_name(device, eir_data.name);
12414 eir_data_free(&eir_data);
12417 struct multi_adv_data {
12418 struct btd_adapter *adapter;
12422 static gboolean multi_adv_start_timeout_cb(gpointer user_data)
12424 struct multi_adv_data *data = user_data;
12425 struct btd_adapter *adapter = data->adapter;
12428 adapter->adv_restart_timeout = 0;
12430 err = adapter_le_enable_multi_adv(adapter, TRUE, data->slot_id);
12432 advertising_state_changed(adapter, data->slot_id, FALSE);
12438 static void multi_adv_state_change_callback(uint16_t index, uint16_t length,
12439 const void *param, void *user_data)
12441 const struct mgmt_ev_vendor_specific_multi_adv_state_changed *ev = param;
12442 struct btd_adapter *adapter = user_data;
12443 struct multi_adv_data *data;
12445 if (length < sizeof(*ev)) {
12446 error("Too small adv state change event");
12450 DBG("adv id %d, state change reason %d, connection_handle %x",
12451 ev->adv_instance, ev->state_change_reason, ev->connection_handle);
12453 if ((ev->adv_instance > 0 && ev->adv_instance < adapter_le_get_max_adv_instance()) &&
12454 ev->state_change_reason == 0) {
12455 /* advertising is stopped by controller, it should be enabled again.
12456 * If fails, state should be changed to FALSE */
12457 data = g_new0(struct multi_adv_data, 1);
12458 data->adapter = adapter;
12459 data->slot_id = ev->adv_instance;
12461 adapter->adv_restart_timeout =
12462 g_timeout_add(300, multi_adv_start_timeout_cb, data);
12466 static void le_conn_update_completed_callback(uint16_t index, uint16_t length,
12467 const void *param, void *user_data)
12469 const struct mgmt_ev_conn_updated *ev = param;
12470 struct btd_adapter *adapter = user_data;
12471 struct btd_device *device;
12473 GSList *list = NULL;
12475 if (length < sizeof(*ev)) {
12476 error("Too small le conn update completed event");
12480 ba2str(&ev->addr.bdaddr, addr);
12481 if (ev->addr.type == BDADDR_LE_PUBLIC) {
12482 /* Private Random Address */
12483 list = g_slist_find_custom(adapter->devices, addr,
12484 device_rpa_ida_cmp);
12487 list = g_slist_find_custom(adapter->devices, addr,
12488 device_address_cmp);
12489 } else if (ev->addr.type == BDADDR_LE_RANDOM) {
12490 /* LE Static Random address */
12491 list = g_slist_find_custom(adapter->devices, addr,
12492 device_address_cmp);
12496 device = list->data;
12497 device_print_addr(device);
12499 if (device_get_conn_update_state(device))
12500 device_set_conn_update_state(device, false);
12504 static void bt_6lowpan_conn_state_change_callback(uint16_t index, uint16_t length,
12505 const void *param, void *user_data)
12507 const struct mgmt_ev_6lowpan_conn_state_changed *ev = param;
12508 struct btd_adapter *adapter = user_data;
12509 struct btd_device *device;
12511 gboolean connected = 0;
12513 if (length < sizeof(*ev)) {
12514 btd_error(adapter->dev_id,
12515 "Too small device connected event");
12519 ba2str(&ev->addr.bdaddr, addr);
12521 DBG("hci%u device %s", index, addr);
12523 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
12526 btd_error(adapter->dev_id,
12527 "Unable to get device object for %s", addr);
12536 device_set_ipsp_connected(device, connected, ev->ifname);
12539 static void bt_le_data_length_changed_callback(uint16_t index, uint16_t length,
12540 const void *param, void *user_data)
12542 const struct mgmt_ev_le_data_length_changed *ev = param;
12543 struct btd_adapter *adapter = user_data;
12544 struct btd_device *device;
12547 if (length < sizeof(*ev)) {
12548 btd_error(adapter->dev_id,
12549 "Too small data length changed event");
12553 ba2str(&ev->addr.bdaddr, addr);
12555 DBG("hci%u device %s", index, addr);
12557 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
12560 btd_error(adapter->dev_id,
12561 "Unable to get device object for %s", addr);
12565 device_le_data_length_changed(device, ev->max_tx_octets, ev->max_tx_time,
12566 ev->max_rx_octets, ev->max_rx_time);
12571 struct btd_adapter_pin_cb_iter *btd_adapter_pin_cb_iter_new(
12572 struct btd_adapter *adapter)
12574 struct btd_adapter_pin_cb_iter *iter =
12575 g_new0(struct btd_adapter_pin_cb_iter, 1);
12577 iter->it = adapter->pin_callbacks;
12583 void btd_adapter_pin_cb_iter_free(struct btd_adapter_pin_cb_iter *iter)
12588 bool btd_adapter_pin_cb_iter_end(struct btd_adapter_pin_cb_iter *iter)
12590 return iter->it == NULL && iter->attempt == 0;
12593 static ssize_t btd_adapter_pin_cb_iter_next(
12594 struct btd_adapter_pin_cb_iter *iter,
12595 struct btd_adapter *adapter,
12596 struct btd_device *device,
12597 char *pin_buf, bool *display)
12599 btd_adapter_pin_cb_t cb;
12602 while (iter->it != NULL) {
12603 cb = iter->it->data;
12604 ret = cb(adapter, device, pin_buf, display, iter->attempt);
12609 iter->it = g_slist_next(iter->it);
12616 static void pin_code_request_callback(uint16_t index, uint16_t length,
12617 const void *param, void *user_data)
12619 const struct mgmt_ev_pin_code_request *ev = param;
12620 struct btd_adapter *adapter = user_data;
12621 struct btd_device *device;
12622 bool display = false;
12627 struct btd_adapter_pin_cb_iter *iter;
12629 if (length < sizeof(*ev)) {
12630 btd_error(adapter->dev_id, "Too small PIN code request event");
12634 ba2str(&ev->addr.bdaddr, addr);
12636 DBG("hci%u %s", adapter->dev_id, addr);
12638 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
12641 btd_error(adapter->dev_id,
12642 "Unable to get device object for %s", addr);
12646 /* Flag the request of a pincode to allow a bonding retry. */
12647 adapter->pincode_requested = true;
12648 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12649 btd_device_set_legacy_pairing(device, true);
12652 memset(pin, 0, sizeof(pin));
12654 iter = device_bonding_iter(device);
12658 pinlen = btd_adapter_pin_cb_iter_next(iter, adapter, device,
12661 if (pinlen > 0 && (!ev->secure || pinlen == 16)) {
12662 if (display && device_is_bonding(device, NULL)) {
12663 err = device_notify_pincode(device, ev->secure, pin);
12665 btd_error(adapter->dev_id,
12666 "device_notify_pin: %s",
12668 btd_adapter_pincode_reply(adapter,
12673 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
12679 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12680 if (main_opts.pin_code) {
12681 /* Because we can't receive user input on headless device,
12682 no need to request pincode. Use the 'PinCode' in headless conf file */
12683 DBG("Use configured PinCode in headless device");
12684 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr,
12685 main_opts.pin_code, strlen(main_opts.pin_code));
12690 err = device_request_pincode(device, ev->secure);
12692 btd_error(adapter->dev_id, "device_request_pin: %s",
12694 btd_adapter_pincode_reply(adapter, &ev->addr.bdaddr, NULL, 0);
12698 int adapter_cancel_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
12701 struct mgmt_addr_info cp;
12704 ba2str(bdaddr, addr);
12705 DBG("hci%u bdaddr %s type %u", adapter->dev_id, addr, addr_type);
12707 memset(&cp, 0, sizeof(cp));
12708 bacpy(&cp.bdaddr, bdaddr);
12709 cp.type = addr_type;
12711 if (mgmt_reply(adapter->mgmt, MGMT_OP_CANCEL_PAIR_DEVICE,
12712 adapter->dev_id, sizeof(cp), &cp,
12713 NULL, NULL, NULL) > 0)
12719 static void check_oob_bonding_complete(struct btd_adapter *adapter,
12720 const bdaddr_t *bdaddr, uint8_t status)
12722 if (!adapter->oob_handler || !adapter->oob_handler->bonding_cb)
12725 if (bacmp(bdaddr, &adapter->oob_handler->remote_addr) != 0)
12728 adapter->oob_handler->bonding_cb(adapter, bdaddr, status,
12729 adapter->oob_handler->user_data);
12731 g_free(adapter->oob_handler);
12732 adapter->oob_handler = NULL;
12735 static void bonding_complete(struct btd_adapter *adapter,
12736 const bdaddr_t *bdaddr,
12737 uint8_t addr_type, uint8_t status)
12739 struct btd_device *device;
12742 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
12744 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
12746 if (device != NULL)
12747 device_bonding_complete(device, addr_type, status);
12749 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12750 resume_discovery(adapter);
12752 check_oob_bonding_complete(adapter, bdaddr, status);
12755 /* bonding_attempt_complete() handles the end of a "bonding attempt" checking if
12756 * it should begin a new attempt or complete the bonding.
12758 static void bonding_attempt_complete(struct btd_adapter *adapter,
12759 const bdaddr_t *bdaddr,
12760 uint8_t addr_type, uint8_t status)
12762 struct btd_device *device;
12765 ba2str(bdaddr, addr);
12766 DBG("hci%u bdaddr %s type %u status 0x%x", adapter->dev_id, addr,
12767 addr_type, status);
12770 device = btd_adapter_get_device(adapter, bdaddr, addr_type);
12772 device = btd_adapter_find_device(adapter, bdaddr, addr_type);
12774 if (status == MGMT_STATUS_AUTH_FAILED && adapter->pincode_requested) {
12775 /* On faliure, issue a bonding_retry if possible. */
12776 if (device != NULL) {
12777 if (device_bonding_attempt_retry(device) == 0)
12782 /* Ignore disconnects during retry. */
12783 if (status == MGMT_STATUS_DISCONNECTED &&
12784 device && device_is_retrying(device))
12787 /* In any other case, finish the bonding. */
12788 bonding_complete(adapter, bdaddr, addr_type, status);
12791 struct pair_device_data {
12792 struct btd_adapter *adapter;
12797 static void free_pair_device_data(void *user_data)
12799 struct pair_device_data *data = user_data;
12804 static gboolean pair_device_timeout(gpointer user_data)
12806 struct pair_device_data *data = user_data;
12807 struct btd_adapter *adapter = data->adapter;
12809 btd_error(adapter->dev_id, "Pair device timed out for hci%u",
12812 adapter->pair_device_timeout = 0;
12814 adapter_cancel_bonding(adapter, &data->bdaddr, data->addr_type);
12819 static void pair_device_complete(uint8_t status, uint16_t length,
12820 const void *param, void *user_data)
12822 const struct mgmt_rp_pair_device *rp = param;
12823 struct pair_device_data *data = user_data;
12824 struct btd_adapter *adapter = data->adapter;
12826 DBG("%s (0x%02x)", mgmt_errstr(status), status);
12828 adapter->pair_device_id = 0;
12830 if (adapter->pair_device_timeout > 0) {
12831 g_source_remove(adapter->pair_device_timeout);
12832 adapter->pair_device_timeout = 0;
12835 /* Workaround for a kernel bug
12837 * Broken kernels may reply to device pairing command with command
12838 * status instead of command complete event e.g. if adapter was not
12841 if (status != MGMT_STATUS_SUCCESS && length < sizeof(*rp)) {
12842 btd_error(adapter->dev_id, "Pair device failed: %s (0x%02x)",
12843 mgmt_errstr(status), status);
12845 bonding_attempt_complete(adapter, &data->bdaddr,
12846 data->addr_type, status);
12850 if (length < sizeof(*rp)) {
12851 btd_error(adapter->dev_id, "Too small pair device response");
12855 bonding_attempt_complete(adapter, &rp->addr.bdaddr, rp->addr.type,
12859 int adapter_create_bonding(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
12860 uint8_t addr_type, uint8_t io_cap)
12862 if (adapter->pair_device_id > 0) {
12863 btd_error(adapter->dev_id,
12864 "Unable pair since another pairing is in progress");
12868 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
12869 suspend_discovery(adapter);
12871 return adapter_bonding_attempt(adapter, bdaddr, addr_type, io_cap);
12874 /* Starts a new bonding attempt in a fresh new bonding_req or a retried one. */
12875 int adapter_bonding_attempt(struct btd_adapter *adapter, const bdaddr_t *bdaddr,
12876 uint8_t addr_type, uint8_t io_cap)
12878 struct mgmt_cp_pair_device cp;
12880 struct pair_device_data *data;
12883 ba2str(bdaddr, addr);
12884 DBG("hci%u bdaddr %s type %d io_cap 0x%02x",
12885 adapter->dev_id, addr, addr_type, io_cap);
12887 /* Reset the pincode_requested flag for a new bonding attempt. */
12888 adapter->pincode_requested = false;
12890 memset(&cp, 0, sizeof(cp));
12891 bacpy(&cp.addr.bdaddr, bdaddr);
12892 cp.addr.type = addr_type;
12893 cp.io_cap = io_cap;
12895 data = g_new0(struct pair_device_data, 1);
12896 data->adapter = adapter;
12897 bacpy(&data->bdaddr, bdaddr);
12898 data->addr_type = addr_type;
12900 id = mgmt_send(adapter->mgmt, MGMT_OP_PAIR_DEVICE,
12901 adapter->dev_id, sizeof(cp), &cp,
12902 pair_device_complete, data,
12903 free_pair_device_data);
12906 btd_error(adapter->dev_id, "Failed to pair %s for hci%u",
12907 addr, adapter->dev_id);
12908 free_pair_device_data(data);
12912 adapter->pair_device_id = id;
12914 /* Due to a bug in the kernel it is possible that a LE pairing
12915 * request never times out. Therefore, add a timer to clean up
12916 * if no response arrives
12918 adapter->pair_device_timeout = g_timeout_add_seconds(BONDING_TIMEOUT,
12919 pair_device_timeout, data);
12924 static void disconnect_notify(struct btd_device *dev, uint8_t reason)
12928 for (l = disconnect_list; l; l = g_slist_next(l)) {
12929 btd_disconnect_cb disconnect_cb = l->data;
12930 disconnect_cb(dev, reason);
12934 static void dev_disconnected(struct btd_adapter *adapter,
12935 const struct mgmt_addr_info *addr,
12938 struct btd_device *device;
12940 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12941 struct device_addr_type t_addr;
12944 ba2str(&addr->bdaddr, dst);
12946 DBG("Device %s disconnected, reason %u", dst, reason);
12948 device = btd_adapter_find_device(adapter, &addr->bdaddr, addr->type);
12950 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
12952 device_get_tizen_addr(device, addr->type, &t_addr);
12954 device_set_disconnect_reason(device, reason);
12955 adapter_remove_connection(adapter, device, t_addr.bdaddr_type);
12956 disconnect_notify(device, reason);
12957 if (device_is_bonded(device, t_addr.bdaddr_type)) {
12958 DBG("addr type %d, bonded", t_addr.bdaddr_type);
12962 bonding_attempt_complete(adapter, &t_addr.bdaddr,
12963 t_addr.bdaddr_type, MGMT_STATUS_DISCONNECTED);
12968 adapter_remove_connection(adapter, device, addr->type);
12969 disconnect_notify(device, reason);
12973 bonding_attempt_complete(adapter, &addr->bdaddr, addr->type,
12974 MGMT_STATUS_DISCONNECTED);
12977 void btd_add_disconnect_cb(btd_disconnect_cb func)
12979 disconnect_list = g_slist_append(disconnect_list, func);
12982 void btd_remove_disconnect_cb(btd_disconnect_cb func)
12984 disconnect_list = g_slist_remove(disconnect_list, func);
12987 static void disconnect_complete(uint8_t status, uint16_t length,
12988 const void *param, void *user_data)
12990 const struct mgmt_rp_disconnect *rp = param;
12991 struct btd_adapter *adapter = user_data;
12993 if (status == MGMT_STATUS_NOT_CONNECTED) {
12994 btd_warn(adapter->dev_id,
12995 "Disconnecting failed: already disconnected");
12996 } else if (status != MGMT_STATUS_SUCCESS) {
12997 btd_error(adapter->dev_id,
12998 "Failed to disconnect device: %s (0x%02x)",
12999 mgmt_errstr(status), status);
13003 if (length < sizeof(*rp)) {
13004 btd_error(adapter->dev_id,
13005 "Too small device disconnect response");
13009 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13010 /* Use HCI error code instead of MGMT disconnection reason */
13011 dev_disconnected(adapter, &rp->addr, 0x16);
13013 dev_disconnected(adapter, &rp->addr, MGMT_DEV_DISCONN_LOCAL_HOST);
13017 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
13018 const bdaddr_t *bdaddr,
13019 uint8_t bdaddr_type)
13022 struct mgmt_cp_disconnect cp;
13024 memset(&cp, 0, sizeof(cp));
13025 bacpy(&cp.addr.bdaddr, bdaddr);
13026 cp.addr.type = bdaddr_type;
13028 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT,
13029 adapter->dev_id, sizeof(cp), &cp,
13030 disconnect_complete, adapter, NULL) > 0)
13036 static void auth_failed_callback(uint16_t index, uint16_t length,
13037 const void *param, void *user_data)
13039 const struct mgmt_ev_auth_failed *ev = param;
13040 struct btd_adapter *adapter = user_data;
13042 if (length < sizeof(*ev)) {
13043 btd_error(adapter->dev_id, "Too small auth failed mgmt event");
13047 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
13051 static void store_link_key(struct btd_adapter *adapter,
13052 struct btd_device *device, const uint8_t *key,
13053 uint8_t type, uint8_t pin_length)
13055 char device_addr[18];
13056 char filename[PATH_MAX];
13057 GKeyFile *key_file;
13063 ba2str(device_get_address(device), device_addr);
13065 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13066 btd_adapter_get_storage_dir(adapter), device_addr);
13067 key_file = g_key_file_new();
13068 g_key_file_load_from_file(key_file, filename, 0, NULL);
13070 for (i = 0; i < 16; i++)
13071 sprintf(key_str + (i * 2), "%2.2X", key[i]);
13073 g_key_file_set_string(key_file, "LinkKey", "Key", key_str);
13075 g_key_file_set_integer(key_file, "LinkKey", "Type", type);
13076 g_key_file_set_integer(key_file, "LinkKey", "PINLength", pin_length);
13078 create_file(filename, S_IRUSR | S_IWUSR);
13080 str = g_key_file_to_data(key_file, &length, NULL);
13081 g_file_set_contents(filename, str, length, NULL);
13084 g_key_file_free(key_file);
13087 static void new_link_key_callback(uint16_t index, uint16_t length,
13088 const void *param, void *user_data)
13090 const struct mgmt_ev_new_link_key *ev = param;
13091 const struct mgmt_addr_info *addr = &ev->key.addr;
13092 struct btd_adapter *adapter = user_data;
13093 struct btd_device *device;
13096 if (length < sizeof(*ev)) {
13097 btd_error(adapter->dev_id, "Too small new link key event");
13101 ba2str(&addr->bdaddr, dst);
13103 DBG("hci%u new key for %s type %u pin_len %u store_hint %u",
13104 adapter->dev_id, dst, ev->key.type, ev->key.pin_len,
13107 if (ev->key.pin_len > 16) {
13108 btd_error(adapter->dev_id,
13109 "Invalid PIN length (%u) in new_key event",
13114 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
13116 btd_error(adapter->dev_id,
13117 "Unable to get device object for %s", dst);
13121 if (ev->store_hint) {
13122 const struct mgmt_link_key_info *key = &ev->key;
13124 store_link_key(adapter, device, key->val, key->type,
13127 device_set_bonded(device, BDADDR_BREDR);
13128 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13130 if (btd_adapter_get_a2dp_role(adapter) == BLUETOOTH_A2DP_SINK_ROLE) {
13131 DBG("store_hint %d", ev->store_hint);
13132 btd_device_set_temporary(device, false);
13139 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
13142 static void store_longtermkey(struct btd_adapter *adapter, const bdaddr_t *peer,
13143 uint8_t bdaddr_type, const unsigned char *key,
13144 uint8_t master, uint8_t authenticated,
13145 uint8_t enc_size, uint16_t ediv,
13148 const char *group = master ? "LongTermKey" : "SlaveLongTermKey";
13149 char device_addr[18];
13150 char filename[PATH_MAX];
13151 GKeyFile *key_file;
13157 if (master != 0x00 && master != 0x01) {
13158 error("Unsupported LTK type %u", master);
13162 ba2str(peer, device_addr);
13164 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13165 btd_adapter_get_storage_dir(adapter), device_addr);
13166 key_file = g_key_file_new();
13167 g_key_file_load_from_file(key_file, filename, 0, NULL);
13169 /* Old files may contain this so remove it in case it exists */
13170 g_key_file_remove_key(key_file, "LongTermKey", "Master", NULL);
13172 for (i = 0; i < 16; i++)
13173 sprintf(key_str + (i * 2), "%2.2X", key[i]);
13175 g_key_file_set_string(key_file, group, "Key", key_str);
13177 g_key_file_set_integer(key_file, group, "Authenticated",
13179 g_key_file_set_integer(key_file, group, "EncSize", enc_size);
13181 g_key_file_set_integer(key_file, group, "EDiv", ediv);
13182 g_key_file_set_uint64(key_file, group, "Rand", rand);
13184 create_file(filename, S_IRUSR | S_IWUSR);
13186 str = g_key_file_to_data(key_file, &length, NULL);
13187 g_file_set_contents(filename, str, length, NULL);
13190 g_key_file_free(key_file);
13193 static void new_long_term_key_callback(uint16_t index, uint16_t length,
13194 const void *param, void *user_data)
13196 const struct mgmt_ev_new_long_term_key *ev = param;
13197 const struct mgmt_addr_info *addr = &ev->key.addr;
13198 struct btd_adapter *adapter = user_data;
13199 struct btd_device *device;
13202 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13203 struct device_addr_type t_addr;
13206 if (length < sizeof(*ev)) {
13207 btd_error(adapter->dev_id, "Too small long term key event");
13211 ba2str(&addr->bdaddr, dst);
13213 DBG("hci%u new LTK for %s type %u enc_size %u",
13214 adapter->dev_id, dst, ev->key.type, ev->key.enc_size);
13216 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
13218 btd_error(adapter->dev_id,
13219 "Unable to get device object for %s", dst);
13224 * Some older kernel versions set store_hint for long term keys
13225 * from resolvable and unresolvable random addresses, but there
13226 * is no point in storing these. Next time around the device
13227 * address will be invalid.
13229 * So only for identity addresses (public and static random) use
13230 * the store_hint as an indication if the long term key should
13231 * be persistently stored.
13234 if (addr->type == BDADDR_LE_RANDOM &&
13235 (addr->bdaddr.b[5] & 0xc0) != 0xc0)
13236 persistent = false;
13238 persistent = !!ev->store_hint;
13241 const struct mgmt_ltk_info *key = &ev->key;
13245 ediv = le16_to_cpu(key->ediv);
13246 rand = le64_to_cpu(key->rand);
13248 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13249 device_get_tizen_addr(device, addr->type, &t_addr);
13250 store_longtermkey(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
13251 key->val, key->master, key->type,
13252 key->enc_size, ediv, rand);
13254 store_longtermkey(adapter, &key->addr.bdaddr,
13255 key->addr.type, key->val, key->master,
13256 key->type, key->enc_size, ediv, rand);
13259 device_set_bonded(device, addr->type);
13262 device_set_ltk_enc_size(device, ev->key.enc_size);
13264 bonding_complete(adapter, &addr->bdaddr, addr->type, 0);
13267 static void store_csrk(struct btd_adapter *adapter, const bdaddr_t *peer,
13268 uint8_t bdaddr_type, const unsigned char *key,
13269 uint32_t counter, uint8_t type)
13272 char device_addr[18];
13273 char filename[PATH_MAX];
13274 GKeyFile *key_file;
13283 group = "LocalSignatureKey";
13287 group = "RemoteSignatureKey";
13291 group = "LocalSignatureKey";
13295 group = "RemoteSignatureKey";
13299 warn("Unsupported CSRK type %u", type);
13303 ba2str(peer, device_addr);
13305 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13306 btd_adapter_get_storage_dir(adapter), device_addr);
13308 key_file = g_key_file_new();
13309 g_key_file_load_from_file(key_file, filename, 0, NULL);
13311 for (i = 0; i < 16; i++)
13312 sprintf(key_str + (i * 2), "%2.2X", key[i]);
13314 g_key_file_set_string(key_file, group, "Key", key_str);
13315 g_key_file_set_integer(key_file, group, "Counter", counter);
13316 g_key_file_set_boolean(key_file, group, "Authenticated", auth);
13318 create_file(filename, S_IRUSR | S_IWUSR);
13320 str = g_key_file_to_data(key_file, &length, NULL);
13321 g_file_set_contents(filename, str, length, NULL);
13324 g_key_file_free(key_file);
13327 static void new_csrk_callback(uint16_t index, uint16_t length,
13328 const void *param, void *user_data)
13330 const struct mgmt_ev_new_csrk *ev = param;
13331 const struct mgmt_addr_info *addr = &ev->key.addr;
13332 const struct mgmt_csrk_info *key = &ev->key;
13333 struct btd_adapter *adapter = user_data;
13334 struct btd_device *device;
13336 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13337 struct device_addr_type t_addr;
13340 if (length < sizeof(*ev)) {
13341 btd_error(adapter->dev_id, "Too small CSRK event");
13345 ba2str(&addr->bdaddr, dst);
13347 DBG("hci%u new CSRK for %s type %u", adapter->dev_id, dst,
13350 device = btd_adapter_get_device(adapter, &addr->bdaddr, addr->type);
13352 btd_error(adapter->dev_id,
13353 "Unable to get device object for %s", dst);
13357 if (!ev->store_hint)
13360 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13361 device_get_tizen_addr(device, addr->type, &t_addr);
13362 store_csrk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, key->val, 0,
13365 store_csrk(adapter, &key->addr.bdaddr, key->addr.type, key->val, 0,
13369 btd_device_set_temporary(device, false);
13372 static void store_irk(struct btd_adapter *adapter, const bdaddr_t *peer,
13373 uint8_t bdaddr_type, const unsigned char *key)
13375 char device_addr[18];
13376 char filename[PATH_MAX];
13377 GKeyFile *key_file;
13383 ba2str(peer, device_addr);
13385 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13386 btd_adapter_get_storage_dir(adapter), device_addr);
13387 key_file = g_key_file_new();
13388 g_key_file_load_from_file(key_file, filename, 0, NULL);
13390 for (i = 0; i < 16; i++)
13391 sprintf(str + (i * 2), "%2.2X", key[i]);
13393 g_key_file_set_string(key_file, "IdentityResolvingKey", "Key", str);
13395 create_file(filename, S_IRUSR | S_IWUSR);
13397 store_data = g_key_file_to_data(key_file, &length, NULL);
13398 g_file_set_contents(filename, store_data, length, NULL);
13399 g_free(store_data);
13401 g_key_file_free(key_file);
13404 static void new_irk_callback(uint16_t index, uint16_t length,
13405 const void *param, void *user_data)
13407 const struct mgmt_ev_new_irk *ev = param;
13408 const struct mgmt_addr_info *addr = &ev->key.addr;
13409 const struct mgmt_irk_info *irk = &ev->key;
13410 struct btd_adapter *adapter = user_data;
13411 struct btd_device *device, *duplicate;
13413 char dst[18], rpa[18];
13414 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13415 struct device_addr_type t_addr;
13418 if (length < sizeof(*ev)) {
13419 btd_error(adapter->dev_id, "Too small New IRK event");
13423 ba2str(&addr->bdaddr, dst);
13424 ba2str(&ev->rpa, rpa);
13426 DBG("hci%u new IRK for %s RPA %s", adapter->dev_id, dst, rpa);
13428 if (bacmp(&ev->rpa, BDADDR_ANY)) {
13429 device = btd_adapter_get_device(adapter, &ev->rpa,
13431 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
13432 device = btd_adapter_get_device(adapter, &ev->rpa,
13434 duplicate = btd_adapter_find_device(adapter, &addr->bdaddr,
13436 if (duplicate == device)
13439 device_set_rpa(device, &ev->rpa);
13443 device = btd_adapter_get_device(adapter, &addr->bdaddr,
13449 btd_error(adapter->dev_id,
13450 "Unable to get device object for %s", dst);
13454 device_update_addr(device, &addr->bdaddr, addr->type);
13457 device_merge_duplicate(device, duplicate);
13459 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13460 device_set_irk_value(device, irk->val);
13463 persistent = !!ev->store_hint;
13467 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13468 device_get_tizen_addr(device, addr->type, &t_addr);
13469 store_irk(adapter, &t_addr.bdaddr, t_addr.bdaddr_type, irk->val);
13471 store_irk(adapter, &addr->bdaddr, addr->type, irk->val);
13474 btd_device_set_temporary(device, false);
13477 static void store_conn_param(struct btd_adapter *adapter, const bdaddr_t *peer,
13478 uint8_t bdaddr_type, uint16_t min_interval,
13479 uint16_t max_interval, uint16_t latency,
13482 char device_addr[18];
13483 char filename[PATH_MAX];
13484 GKeyFile *key_file;
13488 ba2str(peer, device_addr);
13492 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
13493 btd_adapter_get_storage_dir(adapter), device_addr);
13494 key_file = g_key_file_new();
13495 g_key_file_load_from_file(key_file, filename, 0, NULL);
13497 g_key_file_set_integer(key_file, "ConnectionParameters",
13498 "MinInterval", min_interval);
13499 g_key_file_set_integer(key_file, "ConnectionParameters",
13500 "MaxInterval", max_interval);
13501 g_key_file_set_integer(key_file, "ConnectionParameters",
13502 "Latency", latency);
13503 g_key_file_set_integer(key_file, "ConnectionParameters",
13504 "Timeout", timeout);
13506 create_file(filename, S_IRUSR | S_IWUSR);
13508 store_data = g_key_file_to_data(key_file, &length, NULL);
13509 g_file_set_contents(filename, store_data, length, NULL);
13510 g_free(store_data);
13512 g_key_file_free(key_file);
13515 static void new_conn_param(uint16_t index, uint16_t length,
13516 const void *param, void *user_data)
13518 const struct mgmt_ev_new_conn_param *ev = param;
13519 struct btd_adapter *adapter = user_data;
13520 uint16_t min, max, latency, timeout;
13521 struct btd_device *dev;
13523 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13524 struct device_addr_type t_addr;
13527 if (length < sizeof(*ev)) {
13528 btd_error(adapter->dev_id,
13529 "Too small New Connection Parameter event");
13533 ba2str(&ev->addr.bdaddr, dst);
13535 min = btohs(ev->min_interval);
13536 max = btohs(ev->max_interval);
13537 latency = btohs(ev->latency);
13538 timeout = btohs(ev->timeout);
13540 DBG("hci%u %s (%u) min 0x%04x max 0x%04x latency 0x%04x timeout 0x%04x",
13541 adapter->dev_id, dst, ev->addr.type, min, max, latency, timeout);
13543 dev = btd_adapter_get_device(adapter, &ev->addr.bdaddr, ev->addr.type);
13545 btd_error(adapter->dev_id,
13546 "Unable to get device object for %s", dst);
13550 if (!ev->store_hint)
13553 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13554 device_get_tizen_addr(dev, ev->addr.type, &t_addr);
13555 store_conn_param(adapter, &t_addr.bdaddr, t_addr.bdaddr_type,
13556 ev->min_interval, ev->max_interval,
13557 ev->latency, ev->timeout);
13559 store_conn_param(adapter, &ev->addr.bdaddr, ev->addr.type,
13560 ev->min_interval, ev->max_interval,
13561 ev->latency, ev->timeout);
13565 int adapter_set_io_capability(struct btd_adapter *adapter, uint8_t io_cap)
13567 struct mgmt_cp_set_io_capability cp;
13569 if (!main_opts.pairable) {
13570 if (io_cap == IO_CAPABILITY_INVALID) {
13571 if (adapter->current_settings & MGMT_SETTING_BONDABLE)
13572 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x00);
13577 if (!(adapter->current_settings & MGMT_SETTING_BONDABLE))
13578 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
13579 } else if (io_cap == IO_CAPABILITY_INVALID)
13580 io_cap = IO_CAPABILITY_NOINPUTNOOUTPUT;
13582 memset(&cp, 0, sizeof(cp));
13583 cp.io_capability = io_cap;
13585 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IO_CAPABILITY,
13586 adapter->dev_id, sizeof(cp), &cp,
13587 NULL, NULL, NULL) > 0)
13593 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
13594 const bdaddr_t *bdaddr,
13595 uint8_t *hash, uint8_t *randomizer)
13597 struct mgmt_cp_add_remote_oob_data cp;
13600 ba2str(bdaddr, addr);
13601 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
13603 memset(&cp, 0, sizeof(cp));
13604 bacpy(&cp.addr.bdaddr, bdaddr);
13605 memcpy(cp.hash192, hash, 16);
13608 memcpy(cp.rand192, randomizer, 16);
13610 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
13611 adapter->dev_id, sizeof(cp), &cp,
13612 NULL, NULL, NULL) > 0)
13618 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
13619 const bdaddr_t *bdaddr)
13621 struct mgmt_cp_remove_remote_oob_data cp;
13624 ba2str(bdaddr, addr);
13625 DBG("hci%d bdaddr %s", adapter->dev_id, addr);
13627 memset(&cp, 0, sizeof(cp));
13628 bacpy(&cp.addr.bdaddr, bdaddr);
13630 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
13631 adapter->dev_id, sizeof(cp), &cp,
13632 NULL, NULL, NULL) > 0)
13638 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13639 int btd_adapter_add_remote_oob_ext_data(struct btd_adapter *adapter,
13640 const bdaddr_t *bdaddr, uint8_t bdaddr_type,
13641 uint8_t *hash192, uint8_t *randomizer192,
13642 uint8_t *hash256, uint8_t *randomizer256)
13644 struct mgmt_cp_add_remote_oob_data cp;
13647 ba2str(bdaddr, addr);
13648 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
13650 memset(&cp, 0, sizeof(cp));
13651 bacpy(&cp.addr.bdaddr, bdaddr);
13652 cp.addr.type = bdaddr_type;
13654 if (hash192 && randomizer192) {
13655 memcpy(cp.hash192, hash192, 16);
13656 memcpy(cp.rand192, randomizer192, 16);
13659 if (hash256 && randomizer256) {
13660 memcpy(cp.hash256, hash256, 16);
13661 memcpy(cp.rand256, randomizer256, 16);
13664 if (mgmt_send(adapter->mgmt, MGMT_OP_ADD_REMOTE_OOB_DATA,
13665 adapter->dev_id, sizeof(cp), &cp,
13666 NULL, NULL, NULL) > 0)
13672 int btd_adapter_remove_remote_oob_ext_data(struct btd_adapter *adapter,
13673 const bdaddr_t *bdaddr, uint8_t bdaddr_type)
13675 struct mgmt_cp_remove_remote_oob_data cp;
13678 ba2str(bdaddr, addr);
13679 DBG("hci%d bdaddr %s type %d", adapter->dev_id, addr, bdaddr_type);
13681 memset(&cp, 0, sizeof(cp));
13682 bacpy(&cp.addr.bdaddr, bdaddr);
13683 cp.addr.type = bdaddr_type;
13685 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
13686 adapter->dev_id, sizeof(cp), &cp,
13687 NULL, NULL, NULL) > 0)
13694 bool btd_adapter_ssp_enabled(struct btd_adapter *adapter)
13696 if (adapter->current_settings & MGMT_SETTING_SSP)
13702 void btd_adapter_set_oob_handler(struct btd_adapter *adapter,
13703 struct oob_handler *handler)
13705 adapter->oob_handler = handler;
13708 gboolean btd_adapter_check_oob_handler(struct btd_adapter *adapter)
13710 return adapter->oob_handler != NULL;
13713 static void read_local_oob_data_complete(uint8_t status, uint16_t length,
13714 const void *param, void *user_data)
13716 const struct mgmt_rp_read_local_oob_data *rp = param;
13717 struct btd_adapter *adapter = user_data;
13718 const uint8_t *hash, *randomizer;
13719 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13720 const uint8_t *hash256 = NULL;
13721 const uint8_t *randomizer256 = NULL;
13724 if (status != MGMT_STATUS_SUCCESS) {
13725 btd_error(adapter->dev_id,
13726 "Read local OOB data failed: %s (0x%02x)",
13727 mgmt_errstr(status), status);
13730 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13731 } else if (length < 32) {
13733 } else if (length < sizeof(*rp)) {
13735 btd_error(adapter->dev_id,
13736 "Too small read local OOB data response");
13739 hash = rp->hash192;
13740 randomizer = rp->rand192;
13741 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13743 hash256 = rp->hash256;
13744 randomizer256 = rp->rand256;
13749 if (!adapter->oob_handler || !adapter->oob_handler->read_local_cb)
13752 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13753 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
13754 hash256, randomizer256,
13755 adapter->oob_handler->user_data);
13757 adapter->oob_handler->read_local_cb(adapter, hash, randomizer,
13758 adapter->oob_handler->user_data);
13761 g_free(adapter->oob_handler);
13762 adapter->oob_handler = NULL;
13765 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
13767 DBG("hci%u", adapter->dev_id);
13769 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_DATA,
13770 adapter->dev_id, 0, NULL, read_local_oob_data_complete,
13771 adapter, NULL) > 0)
13777 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13778 static void le_read_local_oob_data_complete(uint8_t status, uint16_t length,
13779 const void *param, void *user_data)
13781 const struct mgmt_rp_read_local_oob_ext_data *rp = param;
13782 struct btd_adapter *adapter = user_data;
13784 if (status != MGMT_STATUS_SUCCESS) {
13785 btd_error(adapter->dev_id, "LE Read local OOB data failed: %s (0x%02x)",
13786 mgmt_errstr(status), status);
13787 } else if (length < sizeof(struct mgmt_rp_read_local_oob_ext_data)) {
13788 btd_error(adapter->dev_id,
13789 "Too small read local OOB ext data response");
13793 if (!adapter->oob_handler || !adapter->oob_handler->le_read_local_cb) {
13794 btd_error(adapter->dev_id, "oob_handler is not valid : %p",
13795 adapter->oob_handler);
13799 adapter->oob_handler->le_read_local_cb(adapter, rp->eir_len, rp->eir,
13800 adapter->oob_handler->user_data);
13802 g_free(adapter->oob_handler);
13803 adapter->oob_handler = NULL;
13806 int btd_adapter_le_read_local_oob_data(struct btd_adapter *adapter)
13808 struct mgmt_cp_read_local_oob_ext_data cp;
13810 DBG("hci%u", adapter->dev_id);
13812 memset(&cp, 0, sizeof(cp));
13813 cp.type = (1 << BDADDR_LE_PUBLIC) | (1 << BDADDR_LE_RANDOM);
13815 if (mgmt_send(adapter->mgmt, MGMT_OP_READ_LOCAL_OOB_EXT_DATA,
13816 adapter->dev_id, sizeof(cp), &cp, le_read_local_oob_data_complete,
13817 adapter, NULL) > 0)
13824 void btd_adapter_for_each_device(struct btd_adapter *adapter,
13825 void (*cb)(struct btd_device *device, void *data),
13828 g_slist_foreach(adapter->devices, (GFunc) cb, data);
13831 static int adapter_cmp(gconstpointer a, gconstpointer b)
13833 struct btd_adapter *adapter = (struct btd_adapter *) a;
13834 const bdaddr_t *bdaddr = b;
13836 return bacmp(&adapter->bdaddr, bdaddr);
13839 static int adapter_id_cmp(gconstpointer a, gconstpointer b)
13841 struct btd_adapter *adapter = (struct btd_adapter *) a;
13842 uint16_t id = GPOINTER_TO_UINT(b);
13844 return adapter->dev_id == id ? 0 : -1;
13847 struct btd_adapter *adapter_find(const bdaddr_t *sba)
13851 match = g_slist_find_custom(adapters, sba, adapter_cmp);
13855 return match->data;
13858 struct btd_adapter *adapter_find_by_id(int id)
13862 match = g_slist_find_custom(adapters, GINT_TO_POINTER(id),
13867 return match->data;
13870 void adapter_foreach(adapter_cb func, gpointer user_data)
13872 g_slist_foreach(adapters, (GFunc) func, user_data);
13875 static int set_did(struct btd_adapter *adapter, uint16_t vendor,
13876 uint16_t product, uint16_t version, uint16_t source)
13878 struct mgmt_cp_set_device_id cp;
13880 DBG("hci%u source %x vendor %x product %x version %x",
13881 adapter->dev_id, source, vendor, product, version);
13883 memset(&cp, 0, sizeof(cp));
13885 cp.source = htobs(source);
13886 cp.vendor = htobs(vendor);
13887 cp.product = htobs(product);
13888 cp.version = htobs(version);
13890 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEVICE_ID,
13891 adapter->dev_id, sizeof(cp), &cp,
13892 NULL, NULL, NULL) > 0)
13898 static void services_modified(struct gatt_db_attribute *attrib, void *user_data)
13900 struct btd_adapter *adapter = user_data;
13902 g_dbus_emit_property_changed(dbus_conn, adapter->path,
13903 ADAPTER_INTERFACE, "UUIDs");
13906 static int adapter_register(struct btd_adapter *adapter)
13908 struct agent *agent;
13909 struct gatt_db *db;
13910 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13911 char address[18] = { 0 };
13912 char filename[PATH_MAX] = { 0 };
13918 adapter->path = g_strdup_printf("/org/bluez/hci%d", adapter->dev_id);
13920 if (!g_dbus_register_interface(dbus_conn,
13921 adapter->path, ADAPTER_INTERFACE,
13922 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13923 adapter_methods, adapter_signals,
13925 adapter_methods, NULL,
13927 adapter_properties, adapter,
13929 btd_error(adapter->dev_id,
13930 "Adapter interface init failed on path %s",
13932 g_free(adapter->path);
13933 adapter->path = NULL;
13937 if (adapters == NULL)
13938 adapter->is_default = true;
13940 adapters = g_slist_append(adapters, adapter);
13942 agent = agent_get(NULL);
13944 uint8_t io_cap = agent_get_io_capability(agent);
13945 adapter_set_io_capability(adapter, io_cap);
13946 agent_unref(agent);
13949 /* Don't start GATT database and advertising managers on
13950 * non-LE controllers.
13952 if (!(adapter->supported_settings & MGMT_SETTING_LE) ||
13953 main_opts.mode == BT_MODE_BREDR)
13956 adapter->database = btd_gatt_database_new(adapter);
13957 if (!adapter->database) {
13958 btd_error(adapter->dev_id,
13959 "Failed to create GATT database for adapter");
13960 adapters = g_slist_remove(adapters, adapter);
13964 adapter->adv_manager = btd_adv_manager_new(adapter, adapter->mgmt);
13966 db = btd_gatt_database_get_db(adapter->database);
13967 adapter->db_id = gatt_db_register(db, services_modified,
13971 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13972 ba2str(&adapter->bdaddr, address);
13973 snprintf(filename, PATH_MAX, STORAGEDIR "/%s", address);
13974 delete_tempfiles(filename);
13977 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
13978 adapter_print_devices(adapter);
13980 if (load_local_irk(adapter)) {
13981 if (!(adapter->supported_settings & MGMT_SETTING_PRIVACY))
13982 main_opts.le_privacy = false;
13985 * Some Android devices don't consider the device as LE one,
13986 * if the device doesn't distribute IRK when pairing.
13987 * Because of this compatibility issue, set IRK
13988 * even though privacy feature is disabled.
13990 set_local_irk(adapter);
13992 if (main_opts.le_privacy) {
13993 DBG("Enable LE Privacy feature");
13994 set_privacy(adapter, true);
13996 DBG("Disable LE Privacy feature");
14002 load_config(adapter);
14003 fix_storage(adapter);
14004 load_drivers(adapter);
14005 btd_profile_foreach(probe_profile, adapter);
14006 clear_blocked(adapter);
14007 load_devices(adapter);
14009 /* restore Service Changed CCC value for bonded devices */
14010 btd_gatt_database_restore_svc_chng_ccc(adapter->database);
14012 /* retrieve the active connections: address the scenario where
14013 * the are active connections before the daemon've started */
14014 if (adapter->current_settings & MGMT_SETTING_POWERED)
14015 load_connections(adapter);
14017 adapter->initialized = TRUE;
14019 if (main_opts.did_source) {
14020 /* DeviceID record is added by sdpd-server before any other
14021 * record is registered. */
14022 adapter_service_insert(adapter, sdp_record_find(0x10000));
14023 set_did(adapter, main_opts.did_vendor, main_opts.did_product,
14024 main_opts.did_version, main_opts.did_source);
14027 DBG("Adapter %s registered", adapter->path);
14032 static int adapter_unregister(struct btd_adapter *adapter)
14034 DBG("Unregister path: %s", adapter->path);
14036 adapters = g_slist_remove(adapters, adapter);
14038 if (adapter->is_default && adapters != NULL) {
14039 struct btd_adapter *new_default;
14041 new_default = adapter_find_by_id(hci_get_route(NULL));
14042 if (new_default == NULL)
14043 new_default = adapters->data;
14045 new_default->is_default = true;
14048 adapter_list = g_list_remove(adapter_list, adapter);
14050 adapter_remove(adapter);
14051 btd_adapter_unref(adapter);
14056 static void disconnected_callback(uint16_t index, uint16_t length,
14057 const void *param, void *user_data)
14059 const struct mgmt_ev_device_disconnected *ev = param;
14060 struct btd_adapter *adapter = user_data;
14063 if (length < sizeof(struct mgmt_addr_info)) {
14064 btd_error(adapter->dev_id,
14065 "Too small device disconnected event");
14069 if (length < sizeof(*ev))
14070 reason = MGMT_DEV_DISCONN_UNKNOWN;
14072 reason = ev->reason;
14074 dev_disconnected(adapter, &ev->addr, reason);
14077 static void connected_callback(uint16_t index, uint16_t length,
14078 const void *param, void *user_data)
14080 const struct mgmt_ev_device_connected *ev = param;
14081 struct btd_adapter *adapter = user_data;
14082 struct btd_device *device;
14083 struct eir_data eir_data;
14088 if (length < sizeof(*ev)) {
14089 btd_error(adapter->dev_id, "Too small device connected event");
14093 eir_len = btohs(ev->eir_len);
14094 if (length < sizeof(*ev) + eir_len) {
14095 btd_error(adapter->dev_id, "Too small device connected event");
14099 ba2str(&ev->addr.bdaddr, addr);
14101 DBG("hci%u device %s connected eir_len %u", index, addr, eir_len);
14103 device = btd_adapter_get_device(adapter, &ev->addr.bdaddr,
14106 btd_error(adapter->dev_id,
14107 "Unable to get device object for %s", addr);
14111 memset(&eir_data, 0, sizeof(eir_data));
14113 eir_parse(&eir_data, ev->eir, eir_len);
14115 if (eir_data.class != 0)
14116 device_set_class(device, eir_data.class);
14118 adapter_add_connection(adapter, device, ev->addr.type);
14120 name_known = device_name_known(device);
14122 if (eir_data.name && (eir_data.name_complete || !name_known)) {
14123 device_store_cached_name(device, eir_data.name);
14124 btd_device_device_set_name(device, eir_data.name);
14127 if (eir_data.msd_list)
14128 adapter_msd_notify(adapter, device, eir_data.msd_list);
14130 eir_data_free(&eir_data);
14133 static void device_blocked_callback(uint16_t index, uint16_t length,
14134 const void *param, void *user_data)
14136 const struct mgmt_ev_device_blocked *ev = param;
14137 struct btd_adapter *adapter = user_data;
14138 struct btd_device *device;
14141 if (length < sizeof(*ev)) {
14142 btd_error(adapter->dev_id, "Too small device blocked event");
14146 ba2str(&ev->addr.bdaddr, addr);
14147 DBG("hci%u %s blocked", index, addr);
14149 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
14152 device_block(device, TRUE);
14155 static void device_unblocked_callback(uint16_t index, uint16_t length,
14156 const void *param, void *user_data)
14158 const struct mgmt_ev_device_unblocked *ev = param;
14159 struct btd_adapter *adapter = user_data;
14160 struct btd_device *device;
14163 if (length < sizeof(*ev)) {
14164 btd_error(adapter->dev_id, "Too small device unblocked event");
14168 ba2str(&ev->addr.bdaddr, addr);
14169 DBG("hci%u %s unblocked", index, addr);
14171 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
14174 device_unblock(device, FALSE, TRUE);
14177 static void conn_fail_notify(struct btd_device *dev, uint8_t status)
14181 for (l = conn_fail_list; l; l = g_slist_next(l)) {
14182 btd_conn_fail_cb conn_fail_cb = l->data;
14183 conn_fail_cb(dev, status);
14187 void btd_add_conn_fail_cb(btd_conn_fail_cb func)
14189 conn_fail_list = g_slist_append(conn_fail_list, func);
14192 void btd_remove_conn_fail_cb(btd_conn_fail_cb func)
14194 conn_fail_list = g_slist_remove(conn_fail_list, func);
14197 static void connect_failed_callback(uint16_t index, uint16_t length,
14198 const void *param, void *user_data)
14200 const struct mgmt_ev_connect_failed *ev = param;
14201 struct btd_adapter *adapter = user_data;
14202 struct btd_device *device;
14205 if (length < sizeof(*ev)) {
14206 btd_error(adapter->dev_id, "Too small connect failed event");
14210 ba2str(&ev->addr.bdaddr, addr);
14212 DBG("hci%u %s status %u", index, addr, ev->status);
14214 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
14217 conn_fail_notify(device, ev->status);
14219 /* If the device is in a bonding process cancel any auth request
14220 * sent to the agent before proceeding, but keep the bonding
14221 * request structure. */
14222 if (device_is_bonding(device, NULL))
14223 device_cancel_authentication(device, FALSE);
14226 /* In the case of security mode 3 devices */
14227 bonding_attempt_complete(adapter, &ev->addr.bdaddr, ev->addr.type,
14230 /* If the device is scheduled to retry the bonding wait until the retry
14231 * happens. In other case, proceed with cancel the bondig.
14233 if (device && device_is_bonding(device, NULL)
14234 && !device_is_retrying(device)) {
14235 device_cancel_authentication(device, TRUE);
14236 device_bonding_failed(device, ev->status);
14239 #ifndef TIZEN_FEATURE_BLUEZ_MODIFY
14240 /* In the case the bonding was canceled or did exists, remove the device
14241 * when it is temporary. */
14242 if (device && !device_is_bonding(device, NULL)
14243 && device_is_temporary(device))
14244 btd_adapter_remove_device(adapter, device);
14248 static void remove_keys(struct btd_adapter *adapter,
14249 struct btd_device *device, uint8_t type)
14251 char device_addr[18];
14252 char filename[PATH_MAX];
14253 GKeyFile *key_file;
14257 ba2str(device_get_address(device), device_addr);
14259 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14260 if (device_get_rpa_exist(device) == true)
14261 ba2str(device_get_rpa(device), device_addr);
14264 snprintf(filename, PATH_MAX, STORAGEDIR "/%s/%s/info",
14265 btd_adapter_get_storage_dir(adapter), device_addr);
14266 key_file = g_key_file_new();
14267 g_key_file_load_from_file(key_file, filename, 0, NULL);
14269 if (type == BDADDR_BREDR) {
14270 g_key_file_remove_group(key_file, "LinkKey", NULL);
14272 g_key_file_remove_group(key_file, "LongTermKey", NULL);
14273 g_key_file_remove_group(key_file, "LocalSignatureKey", NULL);
14274 g_key_file_remove_group(key_file, "RemoteSignatureKey", NULL);
14275 g_key_file_remove_group(key_file, "IdentityResolvingKey", NULL);
14278 str = g_key_file_to_data(key_file, &length, NULL);
14279 g_file_set_contents(filename, str, length, NULL);
14282 g_key_file_free(key_file);
14285 static void unpaired_callback(uint16_t index, uint16_t length,
14286 const void *param, void *user_data)
14288 const struct mgmt_ev_device_unpaired *ev = param;
14289 struct btd_adapter *adapter = user_data;
14290 struct btd_device *device;
14293 if (length < sizeof(*ev)) {
14294 btd_error(adapter->dev_id, "Too small device unpaired event");
14298 ba2str(&ev->addr.bdaddr, addr);
14300 DBG("hci%u addr %s", index, addr);
14302 device = btd_adapter_find_device(adapter, &ev->addr.bdaddr,
14305 btd_warn(adapter->dev_id,
14306 "No device object for unpaired device %s", addr);
14310 remove_keys(adapter, device, ev->addr.type);
14311 device_set_unpaired(device, ev->addr.type);
14314 static void clear_devices_complete(uint8_t status, uint16_t length,
14315 const void *param, void *user_data)
14317 if (status != MGMT_STATUS_SUCCESS) {
14318 error("Failed to clear devices: %s (0x%02x)",
14319 mgmt_errstr(status), status);
14324 static int clear_devices(struct btd_adapter *adapter)
14326 struct mgmt_cp_remove_device cp;
14328 if (!kernel_conn_control)
14331 memset(&cp, 0, sizeof(cp));
14333 DBG("sending clear devices command for index %u", adapter->dev_id);
14335 if (mgmt_send(adapter->mgmt, MGMT_OP_REMOVE_DEVICE,
14336 adapter->dev_id, sizeof(cp), &cp,
14337 clear_devices_complete, adapter, NULL) > 0)
14340 btd_error(adapter->dev_id, "Failed to clear devices for index %u",
14346 static bool get_static_addr(struct btd_adapter *adapter)
14348 struct bt_crypto *crypto;
14356 snprintf(mfg, sizeof(mfg), "0x%04x", adapter->manufacturer);
14358 file = g_key_file_new();
14359 g_key_file_load_from_file(file, STORAGEDIR "/addresses", 0, NULL);
14360 addrs = g_key_file_get_string_list(file, "Static", mfg, &len, NULL);
14362 for (i = 0; i < len; i++) {
14365 str2ba(addrs[i], &addr);
14366 if (adapter_find(&addr))
14369 /* Usable address found in list */
14370 bacpy(&adapter->bdaddr, &addr);
14371 adapter->bdaddr_type = BDADDR_LE_RANDOM;
14377 addrs = g_renew(char *, addrs, len + 1);
14380 addrs = g_new(char *, len + 1);
14383 /* Initialize slot for new address */
14384 addrs[len - 1] = g_malloc(18);
14387 crypto = bt_crypto_new();
14389 error("Failed to open crypto");
14394 ret = bt_crypto_random_bytes(crypto, &adapter->bdaddr,
14395 sizeof(adapter->bdaddr));
14397 error("Failed to generate static address");
14398 bt_crypto_unref(crypto);
14402 bt_crypto_unref(crypto);
14404 adapter->bdaddr.b[5] |= 0xc0;
14405 adapter->bdaddr_type = BDADDR_LE_RANDOM;
14407 ba2str(&adapter->bdaddr, addrs[len - 1]);
14409 g_key_file_set_string_list(file, "Static", mfg,
14410 (const char **)addrs, len);
14412 str = g_key_file_to_data(file, &len, NULL);
14413 g_file_set_contents(STORAGEDIR "/addresses", str, len, NULL);
14419 g_key_file_free(file);
14425 static bool set_static_addr(struct btd_adapter *adapter)
14427 struct mgmt_cp_set_static_address cp;
14429 /* dual-mode adapters must have a public address */
14430 if (adapter->supported_settings & MGMT_SETTING_BREDR)
14433 if (!(adapter->supported_settings & MGMT_SETTING_LE))
14436 DBG("Setting static address");
14438 if (!get_static_addr(adapter))
14441 bacpy(&cp.bdaddr, &adapter->bdaddr);
14442 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STATIC_ADDRESS,
14443 adapter->dev_id, sizeof(cp), &cp,
14444 NULL, NULL, NULL) > 0) {
14451 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14452 static uint8_t *generate_irk(void)
14457 DBG("Generate IRK");
14459 fd = open("/dev/urandom", O_RDONLY);
14463 irk = g_malloc0(MGMT_IRK_SIZE);
14464 if (read(fd, irk, MGMT_IRK_SIZE) != MGMT_IRK_SIZE) {
14465 error("Cannot read random bytes");
14475 #define LOCAL_IRK_DIRNAME "/csa/bluetooth"
14476 #define LOCAL_IRK_FILENAME ".local_irk"
14478 static bool store_local_irk(struct btd_adapter *adapter)
14483 if (adapter->local_irk == NULL) {
14484 error("Local IRK is not proper");
14488 if (access(LOCAL_IRK_DIRNAME, F_OK) < 0) {
14489 if (mkdir(LOCAL_IRK_DIRNAME, 0755) < 0) {
14490 error("Cannot create a directory for local IRK : %s",
14496 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME,
14497 O_WRONLY | O_CREAT | O_TRUNC, 0644);
14499 error("Cannot open a file for local IRK : %s", strerror(errno));
14503 ret = write(fd, adapter->local_irk, MGMT_IRK_SIZE);
14504 if (ret != MGMT_IRK_SIZE) {
14505 error("Cannot write local IRK [%d] : %s", ret, strerror(errno));
14508 unlink(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME);
14512 ret = fdatasync(fd);
14514 error("sync failed : %s", strerror(errno));
14520 static bool load_local_irk(struct btd_adapter *adapter)
14525 if (access(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, F_OK) < 0) {
14526 adapter->local_irk = generate_irk();
14527 if (store_local_irk(adapter) == false) {
14528 error("Cannot store Local IRK");
14529 g_free(adapter->local_irk);
14536 if (adapter->local_irk) {
14537 DBG("Local IRK is already loaded");
14541 fd = open(LOCAL_IRK_DIRNAME"/"LOCAL_IRK_FILENAME, O_RDONLY);
14543 error("Cannot open local IRK file : %s", strerror(errno));
14547 adapter->local_irk = g_malloc0(MGMT_IRK_SIZE);
14549 ret = read(fd, adapter->local_irk, MGMT_IRK_SIZE);
14550 if (ret != MGMT_IRK_SIZE) {
14551 error("Cannot read local IRK [%d] : %s", ret, strerror(errno));
14552 g_free(adapter->local_irk);
14561 static void set_privacy_complete(uint8_t status, uint16_t length,
14562 const void *param, void *user_data)
14564 struct btd_adapter *adapter = user_data;
14566 if (status != MGMT_STATUS_SUCCESS)
14567 error("Setting privacy failed for hci%u: %s (0x%02x)",
14568 adapter->dev_id, mgmt_errstr(status), status);
14570 DBG("Privacy feature is set/unset successfully for hci%u",
14574 static bool set_privacy(struct btd_adapter *adapter, bool privacy)
14576 struct mgmt_cp_set_privacy cp;
14578 if (!adapter->local_irk) {
14579 error("Local IRK is not available");
14583 memset(&cp, 0, sizeof(cp));
14584 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
14589 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_PRIVACY,
14590 adapter->dev_id, sizeof(cp), &cp,
14591 set_privacy_complete, adapter, NULL) > 0)
14594 error("Failed to set privacy and load local irk for index %u",
14599 static void set_irk_complete(uint8_t status, uint16_t length,
14600 const void *param, void *user_data)
14602 struct btd_adapter *adapter = user_data;
14604 if (status != MGMT_STATUS_SUCCESS)
14605 error("Setting IRK is failed for hci%u: %s (0x%02x)",
14606 adapter->dev_id, mgmt_errstr(status), status);
14608 DBG("Setting IRK is succeed for hci%u", adapter->dev_id);
14611 static bool set_local_irk(struct btd_adapter *adapter)
14613 struct mgmt_cp_set_irk cp;
14615 if (!adapter->local_irk) {
14616 error("Local IRK is not available");
14620 memcpy(cp.irk, adapter->local_irk, MGMT_IRK_SIZE);
14622 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_IRK,
14623 adapter->dev_id, sizeof(cp), &cp,
14624 set_irk_complete, adapter, NULL) > 0)
14627 error("Failed to set irk %u", adapter->dev_id);
14631 int btd_adapter_connect_ipsp(struct btd_adapter *adapter,
14632 const bdaddr_t *bdaddr,
14633 uint8_t bdaddr_type)
14636 struct mgmt_cp_connect_6lowpan cp;
14638 memset(&cp, 0, sizeof(cp));
14639 bacpy(&cp.addr.bdaddr, bdaddr);
14640 cp.addr.type = bdaddr_type;
14642 if (mgmt_send(adapter->mgmt, MGMT_OP_CONNECT_6LOWPAN,
14643 adapter->dev_id, sizeof(cp), &cp,
14644 NULL, NULL, NULL) > 0)
14650 int btd_adapter_disconnect_ipsp(struct btd_adapter *adapter,
14651 const bdaddr_t *bdaddr,
14652 uint8_t bdaddr_type)
14655 struct mgmt_cp_disconnect_6lowpan cp;
14657 memset(&cp, 0, sizeof(cp));
14658 bacpy(&cp.addr.bdaddr, bdaddr);
14659 cp.addr.type = bdaddr_type;
14661 if (mgmt_send(adapter->mgmt, MGMT_OP_DISCONNECT_6LOWPAN,
14662 adapter->dev_id, sizeof(cp), &cp,
14663 NULL, NULL, NULL) > 0)
14669 uint8_t btd_adapter_get_rpa_res_support_value(
14670 struct btd_adapter *adapter)
14672 return adapter->central_rpa_res_support;
14675 static void set_dev_rpa_res_support_complete(uint8_t status,
14676 uint16_t length, const void *param,
14679 if (status != MGMT_STATUS_SUCCESS)
14680 error("Failed to set RPA resolution support of device : %s (0x%02x)",
14681 mgmt_errstr(status), status);
14683 DBG("Set RPA resolution support successful");
14686 int btd_adapter_set_dev_rpa_res_support(struct btd_adapter *adapter,
14687 struct btd_device *device)
14690 struct mgmt_cp_set_dev_rpa_res_support cp;
14692 DBG("btd_adapter_set_dev_rpa_res_support called");
14694 memset(&cp, 0, sizeof(cp));
14696 bacpy(&cp.addr.bdaddr, device_get_address(device));
14697 cp.addr.type = btd_device_get_bdaddr_type(device);
14698 cp.res_support = device_get_rpa_res_char_value(device);
14700 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_DEV_RPA_RES_SUPPORT,
14701 adapter->dev_id, sizeof(cp), &cp,
14702 set_dev_rpa_res_support_complete, NULL, NULL) > 0)
14709 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14710 static gboolean adapter_start_idle_cb(gpointer user_data)
14712 struct btd_adapter *adapter = (struct btd_adapter*)user_data;
14714 adapter_start(adapter);
14720 static void read_info_complete(uint8_t status, uint16_t length,
14721 const void *param, void *user_data)
14723 struct btd_adapter *adapter = user_data;
14724 const struct mgmt_rp_read_info *rp = param;
14725 uint32_t missing_settings;
14728 DBG("index %u status 0x%02x", adapter->dev_id, status);
14730 if (status != MGMT_STATUS_SUCCESS) {
14731 btd_error(adapter->dev_id,
14732 "Failed to read info for index %u: %s (0x%02x)",
14733 adapter->dev_id, mgmt_errstr(status), status);
14737 if (length < sizeof(*rp)) {
14738 btd_error(adapter->dev_id,
14739 "Too small read info complete response");
14744 * Store controller information for class of device, device
14745 * name, short name and settings.
14747 * During the lifetime of the controller these will be updated by
14748 * events and the information is required to keep the current
14749 * state of the controller.
14751 adapter->dev_class = rp->dev_class[0] | (rp->dev_class[1] << 8) |
14752 (rp->dev_class[2] << 16);
14753 adapter->name = g_strdup((const char *) rp->name);
14754 adapter->short_name = g_strdup((const char *) rp->short_name);
14756 adapter->manufacturer = btohs(rp->manufacturer);
14758 adapter->supported_settings = btohl(rp->supported_settings);
14759 adapter->current_settings = btohl(rp->current_settings);
14761 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14762 adapter_check_version(adapter, rp->version);
14764 clear_uuids(adapter);
14765 clear_devices(adapter);
14767 if (bacmp(&rp->bdaddr, BDADDR_ANY) == 0) {
14768 if (!set_static_addr(adapter)) {
14769 btd_error(adapter->dev_id,
14770 "No Bluetooth address for index %u",
14775 bacpy(&adapter->bdaddr, &rp->bdaddr);
14776 if (!(adapter->supported_settings & MGMT_SETTING_LE))
14777 adapter->bdaddr_type = BDADDR_BREDR;
14779 adapter->bdaddr_type = BDADDR_LE_PUBLIC;
14782 missing_settings = adapter->current_settings ^
14783 adapter->supported_settings;
14785 /* If adapter supports PHY CONFIGURATION SETTING, then read PHY configuration and save them */
14786 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14787 if (adapter->supported_settings & MGMT_SETTING_PHY_CONFIGURATION) {
14788 if (mgmt_send(adapter->mgmt, MGMT_OP_GET_PHY_CONFIGURATION, adapter->dev_id, 0, NULL,
14789 get_phy_configuration_resp, adapter, NULL) == 0)
14790 error("Unable to send %s cmd",
14791 mgmt_opstr(MGMT_OP_GET_PHY_CONFIGURATION));
14794 switch (main_opts.mode) {
14796 if (missing_settings & MGMT_SETTING_SSP) {
14797 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14798 if (main_opts.pin_code || (main_opts.class & 0x1f00) >> 8 == 0x05)
14799 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
14802 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
14804 if (missing_settings & MGMT_SETTING_LE)
14805 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
14806 if (missing_settings & MGMT_SETTING_BREDR)
14807 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
14809 case BT_MODE_BREDR:
14810 if (!(adapter->supported_settings & MGMT_SETTING_BREDR)) {
14811 btd_error(adapter->dev_id,
14812 "Ignoring adapter withouth BR/EDR support");
14816 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14817 if (main_opts.pin_code || (main_opts.class & 0x1f00) >> 8 == 0x05)
14818 set_mode(adapter, MGMT_OP_SET_SSP, 0x00);
14820 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
14822 if (missing_settings & MGMT_SETTING_SSP)
14823 set_mode(adapter, MGMT_OP_SET_SSP, 0x01);
14825 if (missing_settings & MGMT_SETTING_BREDR)
14826 set_mode(adapter, MGMT_OP_SET_BREDR, 0x01);
14827 if (adapter->current_settings & MGMT_SETTING_LE)
14828 set_mode(adapter, MGMT_OP_SET_LE, 0x00);
14831 if (!(adapter->supported_settings & MGMT_SETTING_LE)) {
14832 btd_error(adapter->dev_id,
14833 "Ignoring adapter withouth LE support");
14837 if (missing_settings & MGMT_SETTING_LE)
14838 set_mode(adapter, MGMT_OP_SET_LE, 0x01);
14839 if (adapter->current_settings & MGMT_SETTING_BREDR)
14840 set_mode(adapter, MGMT_OP_SET_BREDR, 0x00);
14844 if (missing_settings & MGMT_SETTING_SECURE_CONN)
14845 set_mode(adapter, MGMT_OP_SET_SECURE_CONN, 0x01);
14847 if (adapter->supported_settings & MGMT_SETTING_PRIVACY)
14848 set_privacy(adapter, main_opts.privacy);
14850 if (main_opts.fast_conn &&
14851 (missing_settings & MGMT_SETTING_FAST_CONNECTABLE))
14852 set_mode(adapter, MGMT_OP_SET_FAST_CONNECTABLE, 0x01);
14854 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14855 /* Set the RPA resolution value to '1' if privacy is supported */
14856 if (main_opts.le_privacy &&
14857 adapter->supported_settings & MGMT_SETTING_PRIVACY)
14858 adapter->central_rpa_res_support = 0x01;
14861 err = adapter_register(adapter);
14863 btd_error(adapter->dev_id, "Unable to register new adapter");
14868 * Register all event notification handlers for controller.
14870 * The handlers are registered after a succcesful read of the
14871 * controller info. From now on they can track updates and
14874 mgmt_register(adapter->mgmt, MGMT_EV_NEW_SETTINGS, adapter->dev_id,
14875 new_settings_callback, adapter, NULL);
14877 mgmt_register(adapter->mgmt, MGMT_EV_CLASS_OF_DEV_CHANGED,
14879 dev_class_changed_callback,
14881 mgmt_register(adapter->mgmt, MGMT_EV_LOCAL_NAME_CHANGED,
14883 local_name_changed_callback,
14886 mgmt_register(adapter->mgmt, MGMT_EV_DISCOVERING,
14888 discovering_callback,
14891 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_FOUND,
14893 device_found_callback,
14896 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14897 mgmt_register(adapter->mgmt, MGMT_EV_LE_DEVICE_FOUND,
14899 le_device_found_callback,
14903 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_DISCONNECTED,
14905 disconnected_callback,
14908 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_CONNECTED,
14910 connected_callback,
14913 mgmt_register(adapter->mgmt, MGMT_EV_CONNECT_FAILED,
14915 connect_failed_callback,
14918 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNPAIRED,
14923 mgmt_register(adapter->mgmt, MGMT_EV_AUTH_FAILED,
14925 auth_failed_callback,
14928 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LINK_KEY,
14930 new_link_key_callback,
14933 mgmt_register(adapter->mgmt, MGMT_EV_NEW_LONG_TERM_KEY,
14935 new_long_term_key_callback,
14938 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CSRK,
14943 mgmt_register(adapter->mgmt, MGMT_EV_NEW_IRK,
14948 mgmt_register(adapter->mgmt, MGMT_EV_NEW_CONN_PARAM,
14953 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_BLOCKED,
14955 device_blocked_callback,
14957 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_UNBLOCKED,
14959 device_unblocked_callback,
14962 mgmt_register(adapter->mgmt, MGMT_EV_PIN_CODE_REQUEST,
14964 pin_code_request_callback,
14967 mgmt_register(adapter->mgmt, MGMT_EV_USER_CONFIRM_REQUEST,
14969 user_confirm_request_callback,
14972 mgmt_register(adapter->mgmt, MGMT_EV_USER_PASSKEY_REQUEST,
14974 user_passkey_request_callback,
14977 mgmt_register(adapter->mgmt, MGMT_EV_PASSKEY_NOTIFY,
14979 user_passkey_notify_callback,
14982 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
14983 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ALERT,
14985 rssi_alert_callback,
14988 mgmt_register(adapter->mgmt, MGMT_EV_RAW_RSSI,
14990 get_raw_rssi_callback,
14993 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_ENABLED,
14995 rssi_enabled_callback,
14998 mgmt_register(adapter->mgmt, MGMT_EV_RSSI_DISABLED,
15000 rssi_disabled_callback,
15003 mgmt_register(adapter->mgmt, MGMT_EV_HARDWARE_ERROR,
15005 hardware_error_callback,
15008 mgmt_register(adapter->mgmt, MGMT_EV_TX_TIMEOUT_ERROR,
15010 tx_timeout_error_callback,
15013 mgmt_register(adapter->mgmt, MGMT_EV_DEVICE_NAME_UPDATE,
15015 device_name_update_callback,
15018 mgmt_register(adapter->mgmt, MGMT_EV_MULTI_ADV_STATE_CHANGED,
15020 multi_adv_state_change_callback,
15023 mgmt_register(adapter->mgmt, MGMT_EV_6LOWPAN_CONN_STATE_CHANGED,
15025 bt_6lowpan_conn_state_change_callback,
15028 mgmt_register(adapter->mgmt, MGMT_EV_LE_DATA_LENGTH_CHANGED,
15030 bt_le_data_length_changed_callback,
15033 mgmt_register(adapter->mgmt, MGMT_EV_CONN_UPDATED,
15035 le_conn_update_completed_callback,
15038 mgmt_register(adapter->mgmt, MGMT_EV_RPA_CHANGED,
15040 rpa_changed_callback,
15044 set_dev_class(adapter);
15046 set_name(adapter, btd_adapter_get_name(adapter));
15048 if (main_opts.pairable &&
15049 !(adapter->current_settings & MGMT_SETTING_BONDABLE))
15050 set_mode(adapter, MGMT_OP_SET_BONDABLE, 0x01);
15052 if (!kernel_conn_control)
15053 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x01);
15054 else if (adapter->current_settings & MGMT_SETTING_CONNECTABLE)
15055 set_mode(adapter, MGMT_OP_SET_CONNECTABLE, 0x00);
15057 if (adapter->stored_discoverable && !adapter->discoverable_timeout)
15058 set_discoverable(adapter, 0x01, 0);
15060 if (adapter->current_settings & MGMT_SETTING_POWERED)
15061 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15062 g_idle_add(adapter_start_idle_cb, adapter);
15064 adapter_start(adapter);
15066 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15068 set_mode(adapter, MGMT_OP_SET_POWERED, 0x01);
15071 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15072 init_le_static_address(adapter);
15079 * Remove adapter from list in case of a failure.
15081 * Leaving an adapter structure around for a controller that can
15082 * not be initilized makes no sense at the moment.
15084 * This is a simplification to avoid constant checks if the
15085 * adapter is ready to do anything.
15087 adapter_list = g_list_remove(adapter_list, adapter);
15089 btd_adapter_unref(adapter);
15092 static void index_added(uint16_t index, uint16_t length, const void *param,
15095 struct btd_adapter *adapter;
15097 DBG("index %u", index);
15099 adapter = btd_adapter_lookup(index);
15101 btd_warn(adapter->dev_id,
15102 "Ignoring index added for an already existing adapter");
15106 adapter = btd_adapter_new(index);
15109 "Unable to create new adapter for index %u", index);
15114 * Protect against potential two executions of read controller info.
15116 * In case the start of the daemon and the action of adding a new
15117 * controller coincide this function might be called twice.
15119 * To avoid the double execution of reading the controller info,
15120 * add the adapter already to the list. If an adapter is already
15121 * present, the second notification will cause a warning. If the
15122 * command fails the adapter is removed from the list again.
15124 adapter_list = g_list_append(adapter_list, adapter);
15126 DBG("sending read info command for index %u", index);
15128 if (mgmt_send(mgmt_master, MGMT_OP_READ_INFO, index, 0, NULL,
15129 read_info_complete, adapter, NULL) > 0)
15132 btd_error(adapter->dev_id,
15133 "Failed to read controller info for index %u", index);
15135 adapter_list = g_list_remove(adapter_list, adapter);
15137 btd_adapter_unref(adapter);
15140 static void index_removed(uint16_t index, uint16_t length, const void *param,
15143 struct btd_adapter *adapter;
15145 DBG("index %u", index);
15147 adapter = btd_adapter_lookup(index);
15149 warn("Ignoring index removal for a non-existent adapter");
15153 adapter_unregister(adapter);
15156 static void read_index_list_complete(uint8_t status, uint16_t length,
15157 const void *param, void *user_data)
15159 const struct mgmt_rp_read_index_list *rp = param;
15163 if (status != MGMT_STATUS_SUCCESS) {
15164 error("Failed to read index list: %s (0x%02x)",
15165 mgmt_errstr(status), status);
15169 if (length < sizeof(*rp)) {
15170 error("Wrong size of read index list response");
15174 num = btohs(rp->num_controllers);
15176 DBG("Number of controllers: %d", num);
15178 if (num * sizeof(uint16_t) + sizeof(*rp) != length) {
15179 error("Incorrect packet size for index list response");
15183 for (i = 0; i < num; i++) {
15186 index = btohs(rp->index[i]);
15188 DBG("Found index %u", index);
15191 * Pretend to be index added event notification.
15193 * It is safe to just trigger the procedure for index
15194 * added notification. It does check against itself.
15196 index_added(index, 0, NULL, NULL);
15200 static void read_commands_complete(uint8_t status, uint16_t length,
15201 const void *param, void *user_data)
15203 const struct mgmt_rp_read_commands *rp = param;
15204 uint16_t num_commands, num_events;
15205 size_t expected_len;
15208 if (status != MGMT_STATUS_SUCCESS) {
15209 error("Failed to read supported commands: %s (0x%02x)",
15210 mgmt_errstr(status), status);
15214 if (length < sizeof(*rp)) {
15215 error("Wrong size of read commands response");
15219 num_commands = btohs(rp->num_commands);
15220 num_events = btohs(rp->num_events);
15222 DBG("Number of commands: %d", num_commands);
15223 DBG("Number of events: %d", num_events);
15225 expected_len = sizeof(*rp) + num_commands * sizeof(uint16_t) +
15226 num_events * sizeof(uint16_t);
15228 if (length < expected_len) {
15229 error("Too small reply for supported commands: (%u != %zu)",
15230 length, expected_len);
15234 for (i = 0; i < num_commands; i++) {
15235 uint16_t op = get_le16(rp->opcodes + i);
15237 if (op == MGMT_OP_ADD_DEVICE) {
15238 DBG("enabling kernel-side connection control");
15239 kernel_conn_control = true;
15244 static void read_version_complete(uint8_t status, uint16_t length,
15245 const void *param, void *user_data)
15247 const struct mgmt_rp_read_version *rp = param;
15249 if (status != MGMT_STATUS_SUCCESS) {
15250 error("Failed to read version information: %s (0x%02x)",
15251 mgmt_errstr(status), status);
15255 if (length < sizeof(*rp)) {
15256 error("Wrong size of read version response");
15260 mgmt_version = rp->version;
15261 mgmt_revision = btohs(rp->revision);
15263 info("Bluetooth management interface %u.%u initialized",
15264 mgmt_version, mgmt_revision);
15266 if (mgmt_version < 1) {
15267 error("Version 1.0 or later of management interface required");
15271 DBG("sending read supported commands command");
15274 * It is irrelevant if this command succeeds or fails. In case of
15275 * failure safe settings are assumed.
15277 mgmt_send(mgmt_master, MGMT_OP_READ_COMMANDS,
15278 MGMT_INDEX_NONE, 0, NULL,
15279 read_commands_complete, NULL, NULL);
15281 mgmt_register(mgmt_master, MGMT_EV_INDEX_ADDED, MGMT_INDEX_NONE,
15282 index_added, NULL, NULL);
15283 mgmt_register(mgmt_master, MGMT_EV_INDEX_REMOVED, MGMT_INDEX_NONE,
15284 index_removed, NULL, NULL);
15286 DBG("sending read index list command");
15288 if (mgmt_send(mgmt_master, MGMT_OP_READ_INDEX_LIST,
15289 MGMT_INDEX_NONE, 0, NULL,
15290 read_index_list_complete, NULL, NULL) > 0)
15293 error("Failed to read controller index list");
15296 static void mgmt_debug(const char *str, void *user_data)
15298 const char *prefix = user_data;
15300 info("%s%s", prefix, str);
15303 int adapter_init(void)
15305 dbus_conn = btd_get_dbus_connection();
15307 mgmt_master = mgmt_new_default();
15308 if (!mgmt_master) {
15309 error("Failed to access management interface");
15313 if (getenv("MGMT_DEBUG"))
15314 mgmt_set_debug(mgmt_master, mgmt_debug, "mgmt: ", NULL);
15316 DBG("sending read version command");
15318 if (mgmt_send(mgmt_master, MGMT_OP_READ_VERSION,
15319 MGMT_INDEX_NONE, 0, NULL,
15320 read_version_complete, NULL, NULL) > 0)
15323 error("Failed to read management version information");
15328 void adapter_cleanup(void)
15330 g_list_free(adapter_list);
15333 struct btd_adapter *adapter = adapters->data;
15335 adapter_remove(adapter);
15336 adapters = g_slist_remove(adapters, adapter);
15337 btd_adapter_unref(adapter);
15341 * In case there is another reference active, clear out
15342 * registered handlers for index added and index removed.
15344 * This is just an extra precaution to be safe, and in
15345 * reality should not make a difference.
15347 mgmt_unregister_index(mgmt_master, MGMT_INDEX_NONE);
15350 * In case there is another reference active, cancel
15351 * all pending global commands.
15353 * This is just an extra precaution to avoid callbacks
15354 * that potentially then could leak memory or access
15355 * an invalid structure.
15357 mgmt_cancel_index(mgmt_master, MGMT_INDEX_NONE);
15359 mgmt_unref(mgmt_master);
15360 mgmt_master = NULL;
15365 void adapter_shutdown(void)
15371 powering_down = true;
15373 for (list = g_list_first(adapter_list); list;
15374 list = g_list_next(list)) {
15375 struct btd_adapter *adapter = list->data;
15377 if (!(adapter->current_settings & MGMT_SETTING_POWERED))
15380 clear_discoverable(adapter);
15381 set_mode(adapter, MGMT_OP_SET_POWERED, 0x00);
15383 adapter_remaining++;
15386 if (!adapter_remaining)
15391 * Check if workaround for broken ATT server socket behavior is needed
15392 * where we need to connect an ATT client socket before pairing to get
15393 * early access to the ATT channel.
15395 bool btd_le_connect_before_pairing(void)
15397 if (MGMT_VERSION(mgmt_version, mgmt_revision) < MGMT_VERSION(1, 4))
15403 #ifdef TIZEN_FEATURE_BLUEZ_MODIFY
15404 int btd_adapter_set_streaming_mode(struct btd_adapter *adapter,
15405 const bdaddr_t *bdaddr, gboolean enable)
15407 struct mgmt_cp_set_streaming_mode cp;
15410 ba2str(bdaddr, addr);
15411 DBG("hci%u device %s", adapter->dev_id, addr);
15413 memset(&cp, 0, sizeof(cp));
15415 cp.streaming_mode = enable ? 1 : 0;
15416 bacpy(&cp.bdaddr, bdaddr);
15418 if (mgmt_send(adapter->mgmt, MGMT_OP_SET_STREAMING_MODE,
15419 adapter->dev_id, sizeof(cp), &cp,
15420 NULL, NULL, NULL) > 0)
15426 void adapter_send_event(const char *event)
15428 struct btd_adapter *adapter = btd_adapter_get_default();
15429 if (adapter == NULL) {
15430 error("adapter is NULL");
15434 g_dbus_emit_signal(dbus_conn, adapter->path,
15435 ADAPTER_INTERFACE, event,
15436 DBUS_TYPE_INVALID);