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
34 #include <sys/ioctl.h>
36 #include <bluetooth/bluetooth.h>
37 #include <bluetooth/uuid.h>
38 #include <bluetooth/sdp.h>
39 #include <bluetooth/sdp_lib.h>
42 #include <dbus/dbus.h>
53 #include "dbus-common.h"
55 #include "glib-helper.h"
61 #include "attrib-server.h"
64 /* Flags Descriptions */
65 #define EIR_LIM_DISC 0x01 /* LE Limited Discoverable Mode */
66 #define EIR_GEN_DISC 0x02 /* LE General Discoverable Mode */
67 #define EIR_BREDR_UNSUP 0x04 /* BR/EDR Not Supported */
68 #define EIR_SIM_CONTROLLER 0x08 /* Simultaneous LE and BR/EDR to Same
69 Device Capable (Controller) */
70 #define EIR_SIM_HOST 0x10 /* Simultaneous LE and BR/EDR to Same
71 Device Capable (Host) */
73 #define IO_CAPABILITY_DISPLAYONLY 0x00
74 #define IO_CAPABILITY_DISPLAYYESNO 0x01
75 #define IO_CAPABILITY_KEYBOARDONLY 0x02
76 #define IO_CAPABILITY_NOINPUTNOOUTPUT 0x03
77 #define IO_CAPABILITY_KEYBOARDDISPLAY 0x04
78 #define IO_CAPABILITY_INVALID 0xFF
80 #define check_address(address) bachk(address)
84 static DBusConnection *connection = NULL;
85 static GSList *adapter_drivers = NULL;
87 static GSList *ops_candidates = NULL;
89 const struct btd_adapter_ops *adapter_ops = NULL;
92 struct btd_adapter *adapter;
93 DBusConnection *conn; /* Connection reference */
94 DBusMessage *msg; /* Unreplied message ref */
95 char *owner; /* Bus name of the owner */
96 guint id; /* Listener id */
97 uint8_t mode; /* Requested mode */
98 int refcount; /* Session refcount */
99 gboolean got_reply; /* Agent reply received */
102 struct service_auth {
105 struct btd_device *device;
106 struct btd_adapter *adapter;
112 char *path; /* adapter object path */
113 bdaddr_t bdaddr; /* adapter Bluetooth Address */
114 uint32_t dev_class; /* Class of Device */
115 char *name; /* adapter name */
116 gboolean allow_name_changes; /* whether the adapter name can be changed */
117 guint stop_discov_id; /* stop inquiry/scanning id */
118 uint32_t discov_timeout; /* discoverable time(sec) */
119 guint pairable_timeout_id; /* pairable timeout id */
120 uint32_t pairable_timeout; /* pairable time(sec) */
121 uint8_t scan_mode; /* scan mode: SCAN_DISABLED, SCAN_PAGE,
123 uint8_t mode; /* off, connectable, discoverable,
125 uint8_t global_mode; /* last valid global mode */
126 struct session_req *pending_mode;
127 int state; /* standard inq, periodic inq, name
128 * resolving, suspended discovery */
129 GSList *found_devices;
130 GSList *oor_devices; /* out of range device list */
131 struct agent *agent; /* For the new API */
132 guint auth_idle_id; /* Ongoing authorization */
133 GSList *connections; /* Connected devices */
134 GSList *devices; /* Devices structure pointers */
135 GSList *mode_sessions; /* Request Mode sessions */
136 GSList *disc_sessions; /* Discovery sessions */
137 guint discov_id; /* Discovery timer */
138 gboolean discovering; /* Discovery active */
139 gboolean discov_suspended; /* Discovery suspended */
140 guint auto_timeout_id; /* Automatic connections timeout */
141 sdp_list_t *services; /* Services associated to adapter */
143 gboolean pairable; /* pairable state */
144 gboolean initialized;
146 gboolean off_requested; /* DEVDOWN ioctl was called */
152 GSList *powered_callbacks;
153 GSList *pin_callbacks;
155 GSList *loaded_drivers;
158 static void dev_info_free(void *data)
160 struct remote_dev_info *dev = data;
164 g_slist_free_full(dev->services, g_free);
165 g_strfreev(dev->uuids);
169 int btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
172 return adapter_ops->set_dev_class(adapter->dev_id, major, minor);
175 static const char *mode2str(uint8_t mode)
180 case MODE_CONNECTABLE:
181 return "connectable";
182 case MODE_DISCOVERABLE:
183 return "discoverable";
189 static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
191 if (strcasecmp("off", mode) == 0)
193 else if (strcasecmp("connectable", mode) == 0)
194 return MODE_CONNECTABLE;
195 else if (strcasecmp("discoverable", mode) == 0)
196 return MODE_DISCOVERABLE;
197 else if (strcasecmp("on", mode) == 0) {
198 char onmode[14], srcaddr[18];
200 ba2str(bdaddr, srcaddr);
201 if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
202 return MODE_CONNECTABLE;
204 return get_mode(bdaddr, onmode);
209 static struct session_req *session_ref(struct session_req *req)
213 DBG("%p: ref=%d", req, req->refcount);
218 static struct session_req *create_session(struct btd_adapter *adapter,
219 DBusConnection *conn, DBusMessage *msg,
220 uint8_t mode, GDBusWatchFunction cb)
222 const char *sender = dbus_message_get_sender(msg);
223 struct session_req *req;
225 req = g_new0(struct session_req, 1);
226 req->adapter = adapter;
227 req->conn = dbus_connection_ref(conn);
228 req->msg = dbus_message_ref(msg);
232 return session_ref(req);
234 req->owner = g_strdup(sender);
235 req->id = g_dbus_add_disconnect_watch(conn, sender, cb, req, NULL);
237 info("%s session %p with %s activated",
238 req->mode ? "Mode" : "Discovery", req, sender);
240 return session_ref(req);
243 static int adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
247 if (mode == MODE_CONNECTABLE)
248 err = adapter_ops->set_discoverable(adapter->dev_id, FALSE, 0);
250 err = adapter_ops->set_discoverable(adapter->dev_id, TRUE,
251 adapter->discov_timeout);
256 static struct session_req *find_session_by_msg(GSList *list, const DBusMessage *msg)
258 for (; list; list = list->next) {
259 struct session_req *req = list->data;
268 static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
274 if (adapter->pending_mode != NULL)
277 if (!adapter->up && new_mode != MODE_OFF) {
278 err = adapter_ops->set_powered(adapter->dev_id, TRUE);
285 if (adapter->up && new_mode == MODE_OFF) {
286 err = adapter_ops->set_powered(adapter->dev_id, FALSE);
290 adapter->off_requested = TRUE;
295 if (new_mode == adapter->mode)
298 err = adapter_set_mode(adapter, new_mode);
304 modestr = mode2str(new_mode);
305 write_device_mode(&adapter->bdaddr, modestr);
310 struct session_req *req;
312 req = find_session_by_msg(adapter->mode_sessions, msg);
314 adapter->pending_mode = req;
317 /* Wait for mode change to reply */
318 adapter->pending_mode = create_session(adapter,
319 connection, msg, new_mode, NULL);
321 /* Nothing to reply just write the new mode */
322 adapter->mode = new_mode;
327 static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
328 gboolean discoverable, void *data)
330 struct btd_adapter *adapter = data;
334 mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
336 if (mode == adapter->mode) {
337 adapter->global_mode = mode;
338 return dbus_message_new_method_return(msg);
341 err = set_mode(adapter, mode, msg);
343 return btd_error_failed(msg, strerror(-err));
348 static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
349 gboolean powered, void *data)
351 struct btd_adapter *adapter = data;
356 mode = get_mode(&adapter->bdaddr, "on");
357 return set_discoverable(conn, msg, mode == MODE_DISCOVERABLE,
363 if (mode == adapter->mode) {
364 adapter->global_mode = mode;
365 return dbus_message_new_method_return(msg);
368 err = set_mode(adapter, mode, msg);
370 return btd_error_failed(msg, strerror(-err));
375 static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
376 gboolean pairable, void *data)
378 struct btd_adapter *adapter = data;
381 if (adapter->scan_mode == SCAN_DISABLED)
382 return btd_error_not_ready(msg);
384 if (pairable == adapter->pairable)
387 if (!(adapter->scan_mode & SCAN_INQUIRY))
390 err = set_mode(adapter, MODE_DISCOVERABLE, NULL);
392 return btd_error_failed(msg, strerror(-err));
395 adapter_ops->set_pairable(adapter->dev_id, pairable);
398 return msg ? dbus_message_new_method_return(msg) : NULL;
401 static gboolean pairable_timeout_handler(void *data)
403 set_pairable(NULL, NULL, FALSE, data);
408 static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
411 if (adapter->pairable_timeout_id) {
412 g_source_remove(adapter->pairable_timeout_id);
413 adapter->pairable_timeout_id = 0;
419 adapter->pairable_timeout_id = g_timeout_add_seconds(interval,
420 pairable_timeout_handler,
424 void btd_adapter_pairable_changed(struct btd_adapter *adapter,
427 adapter->pairable = pairable;
429 write_device_pairable(&adapter->bdaddr, pairable);
431 emit_property_changed(connection, adapter->path,
432 ADAPTER_INTERFACE, "Pairable",
433 DBUS_TYPE_BOOLEAN, &pairable);
435 if (pairable && adapter->pairable_timeout)
436 adapter_set_pairable_timeout(adapter,
437 adapter->pairable_timeout);
440 static struct session_req *find_session(GSList *list, const char *sender)
442 for (; list; list = list->next) {
443 struct session_req *req = list->data;
445 if (g_str_equal(req->owner, sender))
452 static uint8_t get_needed_mode(struct btd_adapter *adapter, uint8_t mode)
456 if (adapter->global_mode > mode)
457 mode = adapter->global_mode;
459 for (l = adapter->mode_sessions; l; l = l->next) {
460 struct session_req *req = l->data;
462 if (req->mode > mode)
469 static GSList *remove_bredr(GSList *all)
473 for (l = all, le = NULL; l; l = l->next) {
474 struct remote_dev_info *dev = l->data;
475 if (dev->bdaddr_type == BDADDR_BREDR) {
480 le = g_slist_append(le, dev);
488 /* Called when a session gets removed or the adapter is stopped */
489 static void stop_discovery(struct btd_adapter *adapter)
491 adapter->found_devices = remove_bredr(adapter->found_devices);
493 if (adapter->oor_devices) {
494 g_slist_free(adapter->oor_devices);
495 adapter->oor_devices = NULL;
498 /* Reset if suspended, otherwise remove timer (software scheduler)
499 * or request inquiry to stop */
500 if (adapter->discov_suspended) {
501 adapter->discov_suspended = FALSE;
505 if (adapter->discov_id > 0) {
506 g_source_remove(adapter->discov_id);
507 adapter->discov_id = 0;
512 adapter_ops->stop_discovery(adapter->dev_id);
515 static void session_remove(struct session_req *req)
517 struct btd_adapter *adapter = req->adapter;
519 /* Ignore set_mode session */
520 if (req->owner == NULL)
523 DBG("%s session %p with %s deactivated",
524 req->mode ? "Mode" : "Discovery", req, req->owner);
529 adapter->mode_sessions = g_slist_remove(adapter->mode_sessions,
532 mode = get_needed_mode(adapter, adapter->global_mode);
534 if (mode == adapter->mode)
537 DBG("Switching to '%s' mode", mode2str(mode));
539 set_mode(adapter, mode, NULL);
541 adapter->disc_sessions = g_slist_remove(adapter->disc_sessions,
544 if (adapter->disc_sessions)
547 DBG("Stopping discovery");
549 stop_discovery(adapter);
553 static void session_free(void *data)
555 struct session_req *req = data;
558 g_dbus_remove_watch(req->conn, req->id);
561 dbus_message_unref(req->msg);
562 if (!req->got_reply && req->mode && req->adapter->agent)
563 agent_cancel(req->adapter->agent);
567 dbus_connection_unref(req->conn);
572 static void session_owner_exit(DBusConnection *conn, void *user_data)
574 struct session_req *req = user_data;
582 static void session_unref(struct session_req *req)
586 DBG("%p: ref=%d", req, req->refcount);
595 static void confirm_mode_cb(struct agent *agent, DBusError *derr, void *data)
597 struct session_req *req = data;
601 req->got_reply = TRUE;
603 if (derr && dbus_error_is_set(derr)) {
604 reply = dbus_message_new_error(req->msg, derr->name,
606 g_dbus_send_message(req->conn, reply);
611 err = set_mode(req->adapter, req->mode, req->msg);
613 reply = btd_error_failed(req->msg, strerror(-err));
614 else if (!req->adapter->pending_mode)
615 reply = dbus_message_new_method_return(req->msg);
621 * Send reply immediately only if there was an error changing
622 * mode, or change is not needed. Otherwise, reply is sent in
625 g_dbus_send_message(req->conn, reply);
627 dbus_message_unref(req->msg);
631 if (!find_session(req->adapter->mode_sessions, req->owner))
635 static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
640 struct btd_adapter *adapter = data;
643 if (adapter->discov_timeout == timeout && timeout == 0)
644 return dbus_message_new_method_return(msg);
646 if (adapter->scan_mode & SCAN_INQUIRY)
647 adapter_ops->set_discoverable(adapter->dev_id, TRUE, timeout);
649 adapter->discov_timeout = timeout;
651 write_discoverable_timeout(&adapter->bdaddr, timeout);
653 path = dbus_message_get_path(msg);
655 emit_property_changed(conn, path,
656 ADAPTER_INTERFACE, "DiscoverableTimeout",
657 DBUS_TYPE_UINT32, &timeout);
659 return dbus_message_new_method_return(msg);
662 static DBusMessage *set_pairable_timeout(DBusConnection *conn,
667 struct btd_adapter *adapter = data;
670 if (adapter->pairable_timeout == timeout && timeout == 0)
671 return dbus_message_new_method_return(msg);
673 if (adapter->pairable)
674 adapter_set_pairable_timeout(adapter, timeout);
676 adapter->pairable_timeout = timeout;
678 write_pairable_timeout(&adapter->bdaddr, timeout);
680 path = dbus_message_get_path(msg);
682 emit_property_changed(conn, path,
683 ADAPTER_INTERFACE, "PairableTimeout",
684 DBUS_TYPE_UINT32, &timeout);
686 return dbus_message_new_method_return(msg);
689 void btd_adapter_class_changed(struct btd_adapter *adapter, uint32_t new_class)
693 class[2] = (new_class >> 16) & 0xff;
694 class[1] = (new_class >> 8) & 0xff;
695 class[0] = new_class & 0xff;
697 write_local_class(&adapter->bdaddr, class);
699 adapter->dev_class = new_class;
701 if (main_opts.gatt_enabled) {
702 /* Removes service class */
703 class[1] = class[1] & 0x1f;
704 attrib_gap_set(adapter, GATT_CHARAC_APPEARANCE, class, 2);
707 emit_property_changed(connection, adapter->path,
708 ADAPTER_INTERFACE, "Class",
709 DBUS_TYPE_UINT32, &new_class);
712 void adapter_name_changed(struct btd_adapter *adapter, const char *name)
714 if (g_strcmp0(adapter->name, name) == 0)
717 g_free(adapter->name);
718 adapter->name = g_strdup(name);
721 emit_property_changed(connection, adapter->path,
722 ADAPTER_INTERFACE, "Name",
723 DBUS_TYPE_STRING, &name);
725 if (main_opts.gatt_enabled)
726 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
727 (const uint8_t *) name, strlen(name));
730 int adapter_set_name(struct btd_adapter *adapter, const char *name)
732 char maxname[MAX_NAME_LENGTH + 1];
734 if (g_strcmp0(adapter->name, name) == 0)
737 memset(maxname, 0, sizeof(maxname));
738 strncpy(maxname, name, MAX_NAME_LENGTH);
739 if (!g_utf8_validate(maxname, -1, NULL)) {
740 error("Name change failed: supplied name isn't valid UTF-8");
745 int err = adapter_ops->set_name(adapter->dev_id, maxname);
749 g_free(adapter->name);
750 adapter->name = g_strdup(maxname);
753 write_local_name(&adapter->bdaddr, maxname);
758 static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
759 const char *name, void *data)
761 struct btd_adapter *adapter = data;
764 if (adapter->allow_name_changes == FALSE)
765 return btd_error_failed(msg, strerror(EPERM));
767 ret = adapter_set_name(adapter, name);
769 return btd_error_invalid_args(msg);
771 return btd_error_failed(msg, strerror(-ret));
773 return dbus_message_new_method_return(msg);
776 struct btd_device *adapter_find_device(struct btd_adapter *adapter,
779 struct btd_device *device;
785 l = g_slist_find_custom(adapter->devices, dest,
786 (GCompareFunc) device_address_cmp);
795 static void adapter_update_devices(struct btd_adapter *adapter)
802 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
803 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
804 struct btd_device *dev = l->data;
805 devices[i] = (char *) device_get_path(dev);
808 emit_array_property_changed(connection, adapter->path,
809 ADAPTER_INTERFACE, "Devices",
810 DBUS_TYPE_OBJECT_PATH, &devices, i);
814 static void adapter_emit_uuids_updated(struct btd_adapter *adapter)
820 if (!adapter->initialized)
823 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
825 for (i = 0, list = adapter->services; list; list = list->next) {
827 sdp_record_t *rec = list->data;
829 uuid = bt_uuid2string(&rec->svclass);
834 emit_array_property_changed(connection, adapter->path,
835 ADAPTER_INTERFACE, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
840 static uint8_t get_uuid_mask(uuid_t *uuid)
842 if (uuid->type != SDP_UUID16)
845 switch (uuid->value.uuid16) {
846 case DIALUP_NET_SVCLASS_ID:
848 return 0x42; /* Telephony & Networking */
849 case IRMC_SYNC_SVCLASS_ID:
850 case OBEX_OBJPUSH_SVCLASS_ID:
851 case OBEX_FILETRANS_SVCLASS_ID:
852 case IRMC_SYNC_CMD_SVCLASS_ID:
853 case PBAP_PSE_SVCLASS_ID:
854 return 0x10; /* Object Transfer */
855 case HEADSET_SVCLASS_ID:
856 case HANDSFREE_SVCLASS_ID:
857 return 0x20; /* Audio */
858 case CORDLESS_TELEPHONY_SVCLASS_ID:
859 case INTERCOM_SVCLASS_ID:
863 * Setting the telephony bit for the handsfree audio gateway
864 * role is not required by the HFP specification, but the
865 * Nokia 616 carkit is just plain broken! It will refuse
866 * pairing without this bit set.
868 case HANDSFREE_AGW_SVCLASS_ID:
869 return 0x40; /* Telephony */
870 case AUDIO_SOURCE_SVCLASS_ID:
871 case VIDEO_SOURCE_SVCLASS_ID:
872 return 0x08; /* Capturing */
873 case AUDIO_SINK_SVCLASS_ID:
874 case VIDEO_SINK_SVCLASS_ID:
875 return 0x04; /* Rendering */
876 case PANU_SVCLASS_ID:
879 return 0x02; /* Networking */
885 static int uuid_cmp(const void *a, const void *b)
887 const sdp_record_t *rec = a;
888 const uuid_t *uuid = b;
890 return sdp_uuid_cmp(&rec->svclass, uuid);
893 void adapter_service_insert(struct btd_adapter *adapter, void *r)
895 sdp_record_t *rec = r;
898 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
903 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
907 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
908 adapter_ops->add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
911 adapter_emit_uuids_updated(adapter);
914 void adapter_service_remove(struct btd_adapter *adapter, void *r)
916 sdp_record_t *rec = r;
918 adapter->services = sdp_list_remove(adapter->services, rec);
920 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
921 adapter_ops->remove_uuid(adapter->dev_id, &rec->svclass);
923 adapter_emit_uuids_updated(adapter);
926 static struct btd_device *adapter_create_device(DBusConnection *conn,
927 struct btd_adapter *adapter,
931 struct btd_device *device;
936 device = device_create(conn, adapter, address, bdaddr_type);
940 device_set_temporary(device, TRUE);
942 adapter->devices = g_slist_append(adapter->devices, device);
944 path = device_get_path(device);
945 g_dbus_emit_signal(conn, adapter->path,
946 ADAPTER_INTERFACE, "DeviceCreated",
947 DBUS_TYPE_OBJECT_PATH, &path,
950 adapter_update_devices(adapter);
955 void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
956 struct btd_device *device,
957 gboolean remove_storage)
959 const gchar *dev_path = device_get_path(device);
962 adapter->devices = g_slist_remove(adapter->devices, device);
963 adapter->connections = g_slist_remove(adapter->connections, device);
965 adapter_update_devices(adapter);
967 g_dbus_emit_signal(conn, adapter->path,
968 ADAPTER_INTERFACE, "DeviceRemoved",
969 DBUS_TYPE_OBJECT_PATH, &dev_path,
972 agent = device_get_agent(device);
974 if (agent && device_is_authorizing(device))
977 device_remove(device, remove_storage);
980 struct btd_device *adapter_get_device(DBusConnection *conn,
981 struct btd_adapter *adapter,
982 const gchar *address)
984 struct btd_device *device;
991 device = adapter_find_device(adapter, address);
995 return adapter_create_device(conn, adapter, address,
999 static gboolean discovery_cb(gpointer user_data)
1001 struct btd_adapter *adapter = user_data;
1004 adapter->discov_id = 0;
1006 err = adapter_ops->start_discovery(adapter->dev_id);
1008 error("start_discovery: %s (%d)", strerror(-err), -err);
1013 static DBusMessage *adapter_start_discovery(DBusConnection *conn,
1014 DBusMessage *msg, void *data)
1016 struct session_req *req;
1017 struct btd_adapter *adapter = data;
1018 const char *sender = dbus_message_get_sender(msg);
1022 return btd_error_not_ready(msg);
1024 req = find_session(adapter->disc_sessions, sender);
1027 return dbus_message_new_method_return(msg);
1030 if (adapter->disc_sessions)
1033 g_slist_free_full(adapter->found_devices, dev_info_free);
1034 adapter->found_devices = NULL;
1036 g_slist_free(adapter->oor_devices);
1037 adapter->oor_devices = NULL;
1039 if (adapter->discov_suspended)
1042 err = adapter_ops->start_discovery(adapter->dev_id);
1044 return btd_error_failed(msg, strerror(-err));
1047 req = create_session(adapter, conn, msg, 0,
1048 session_owner_exit);
1050 adapter->disc_sessions = g_slist_append(adapter->disc_sessions, req);
1052 return dbus_message_new_method_return(msg);
1055 static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
1056 DBusMessage *msg, void *data)
1058 struct btd_adapter *adapter = data;
1059 struct session_req *req;
1060 const char *sender = dbus_message_get_sender(msg);
1063 return btd_error_not_ready(msg);
1065 req = find_session(adapter->disc_sessions, sender);
1067 return btd_error_failed(msg, "Invalid discovery session");
1070 info("Stopping discovery");
1071 return dbus_message_new_method_return(msg);
1074 static DBusMessage *get_properties(DBusConnection *conn,
1075 DBusMessage *msg, void *data)
1077 struct btd_adapter *adapter = data;
1078 const char *property;
1080 DBusMessageIter iter;
1081 DBusMessageIter dict;
1084 char **devices, **uuids;
1089 ba2str(&adapter->bdaddr, srcaddr);
1091 if (check_address(srcaddr) < 0)
1092 return btd_error_invalid_args(msg);
1094 reply = dbus_message_new_method_return(msg);
1098 dbus_message_iter_init_append(reply, &iter);
1100 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1101 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1102 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
1103 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1107 dict_append_entry(&dict, "Address", DBUS_TYPE_STRING, &property);
1110 property = adapter->name ? : "";
1112 dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &property);
1115 dict_append_entry(&dict, "Class",
1116 DBUS_TYPE_UINT32, &adapter->dev_class);
1119 value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE;
1120 dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value);
1123 value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
1124 dict_append_entry(&dict, "Discoverable", DBUS_TYPE_BOOLEAN, &value);
1127 dict_append_entry(&dict, "Pairable", DBUS_TYPE_BOOLEAN,
1128 &adapter->pairable);
1130 /* DiscoverableTimeout */
1131 dict_append_entry(&dict, "DiscoverableTimeout",
1132 DBUS_TYPE_UINT32, &adapter->discov_timeout);
1134 /* PairableTimeout */
1135 dict_append_entry(&dict, "PairableTimeout",
1136 DBUS_TYPE_UINT32, &adapter->pairable_timeout);
1140 dict_append_entry(&dict, "Discovering", DBUS_TYPE_BOOLEAN,
1141 &adapter->discovering);
1144 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1145 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1146 struct btd_device *dev = l->data;
1147 devices[i] = (char *) device_get_path(dev);
1149 dict_append_array(&dict, "Devices", DBUS_TYPE_OBJECT_PATH,
1154 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
1156 for (i = 0, list = adapter->services; list; list = list->next) {
1157 sdp_record_t *rec = list->data;
1160 uuid = bt_uuid2string(&rec->svclass);
1165 dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
1169 dbus_message_iter_close_container(&iter, &dict);
1174 static DBusMessage *set_property(DBusConnection *conn,
1175 DBusMessage *msg, void *data)
1177 DBusMessageIter iter;
1178 DBusMessageIter sub;
1179 const char *property;
1181 if (!dbus_message_iter_init(msg, &iter))
1182 return btd_error_invalid_args(msg);
1184 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1185 return btd_error_invalid_args(msg);
1187 dbus_message_iter_get_basic(&iter, &property);
1188 dbus_message_iter_next(&iter);
1190 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1191 return btd_error_invalid_args(msg);
1192 dbus_message_iter_recurse(&iter, &sub);
1194 if (g_str_equal("Name", property)) {
1197 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1198 return btd_error_invalid_args(msg);
1199 dbus_message_iter_get_basic(&sub, &name);
1201 return set_name(conn, msg, name, data);
1202 } else if (g_str_equal("Powered", property)) {
1205 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1206 return btd_error_invalid_args(msg);
1208 dbus_message_iter_get_basic(&sub, &powered);
1210 return set_powered(conn, msg, powered, data);
1211 } else if (g_str_equal("Discoverable", property)) {
1212 gboolean discoverable;
1214 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1215 return btd_error_invalid_args(msg);
1217 dbus_message_iter_get_basic(&sub, &discoverable);
1219 return set_discoverable(conn, msg, discoverable, data);
1220 } else if (g_str_equal("DiscoverableTimeout", property)) {
1223 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1224 return btd_error_invalid_args(msg);
1226 dbus_message_iter_get_basic(&sub, &timeout);
1228 return set_discoverable_timeout(conn, msg, timeout, data);
1229 } else if (g_str_equal("Pairable", property)) {
1232 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1233 return btd_error_invalid_args(msg);
1235 dbus_message_iter_get_basic(&sub, &pairable);
1237 return set_pairable(conn, msg, pairable, data);
1238 } else if (g_str_equal("PairableTimeout", property)) {
1241 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1242 return btd_error_invalid_args(msg);
1244 dbus_message_iter_get_basic(&sub, &timeout);
1246 return set_pairable_timeout(conn, msg, timeout, data);
1249 return btd_error_invalid_args(msg);
1252 static DBusMessage *request_session(DBusConnection *conn,
1253 DBusMessage *msg, void *data)
1255 struct btd_adapter *adapter = data;
1256 struct session_req *req;
1257 const char *sender = dbus_message_get_sender(msg);
1261 if (!adapter->agent)
1262 return btd_error_agent_not_available(msg);
1264 if (!adapter->mode_sessions)
1265 adapter->global_mode = adapter->mode;
1267 new_mode = get_mode(&adapter->bdaddr, "on");
1269 req = find_session(adapter->mode_sessions, sender);
1272 return dbus_message_new_method_return(msg);
1274 req = create_session(adapter, conn, msg, new_mode,
1275 session_owner_exit);
1276 adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1280 /* No need to change mode */
1281 if (adapter->mode >= new_mode)
1282 return dbus_message_new_method_return(msg);
1284 err = agent_confirm_mode_change(adapter->agent, mode2str(new_mode),
1285 confirm_mode_cb, req, NULL);
1288 return btd_error_failed(msg, strerror(-err));
1294 static DBusMessage *release_session(DBusConnection *conn,
1295 DBusMessage *msg, void *data)
1297 struct btd_adapter *adapter = data;
1298 struct session_req *req;
1299 const char *sender = dbus_message_get_sender(msg);
1301 req = find_session(adapter->mode_sessions, sender);
1303 return btd_error_failed(msg, "Invalid Session");
1307 return dbus_message_new_method_return(msg);
1310 static DBusMessage *list_devices(DBusConnection *conn,
1311 DBusMessage *msg, void *data)
1313 struct btd_adapter *adapter = data;
1316 DBusMessageIter iter;
1317 DBusMessageIter array_iter;
1318 const gchar *dev_path;
1320 reply = dbus_message_new_method_return(msg);
1324 dbus_message_iter_init_append(reply, &iter);
1325 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1326 DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
1328 for (l = adapter->devices; l; l = l->next) {
1329 struct btd_device *device = l->data;
1331 dev_path = device_get_path(device);
1333 dbus_message_iter_append_basic(&array_iter,
1334 DBUS_TYPE_OBJECT_PATH, &dev_path);
1337 dbus_message_iter_close_container(&iter, &array_iter);
1342 static DBusMessage *cancel_device_creation(DBusConnection *conn,
1343 DBusMessage *msg, void *data)
1345 struct btd_adapter *adapter = data;
1346 const gchar *address, *sender = dbus_message_get_sender(msg);
1347 struct btd_device *device;
1349 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1350 DBUS_TYPE_INVALID) == FALSE)
1351 return btd_error_invalid_args(msg);
1353 if (check_address(address) < 0)
1354 return btd_error_invalid_args(msg);
1356 device = adapter_find_device(adapter, address);
1357 if (!device || !device_is_creating(device, NULL))
1358 return btd_error_does_not_exist(msg);
1360 if (!device_is_creating(device, sender))
1361 return btd_error_not_authorized(msg);
1363 device_set_temporary(device, TRUE);
1365 if (device_is_connected(device)) {
1366 device_request_disconnect(device, msg);
1370 adapter_remove_device(conn, adapter, device, TRUE);
1372 return dbus_message_new_method_return(msg);
1375 static struct btd_device *create_device_internal(DBusConnection *conn,
1376 struct btd_adapter *adapter,
1377 const char *address, int *err)
1379 struct remote_dev_info *dev;
1380 struct btd_device *device;
1382 uint8_t bdaddr_type;
1384 str2ba(address, &addr);
1386 dev = adapter_search_found_devices(adapter, &addr);
1388 bdaddr_type = dev->bdaddr_type;
1390 bdaddr_type = BDADDR_BREDR;
1392 device = adapter_create_device(conn, adapter, address, bdaddr_type);
1399 static DBusMessage *create_device(DBusConnection *conn,
1400 DBusMessage *msg, void *data)
1402 struct btd_adapter *adapter = data;
1403 struct btd_device *device;
1404 const gchar *address;
1408 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1409 DBUS_TYPE_INVALID) == FALSE)
1410 return btd_error_invalid_args(msg);
1412 if (check_address(address) < 0)
1413 return btd_error_invalid_args(msg);
1416 return btd_error_not_ready(msg);
1418 if (adapter_find_device(adapter, address))
1419 return btd_error_already_exists(msg);
1423 device = create_device_internal(conn, adapter, address, &err);
1427 if (device_is_bredr(device))
1428 err = device_browse_sdp(device, conn, msg, NULL, FALSE);
1430 err = device_browse_primary(device, conn, msg, FALSE);
1433 adapter_remove_device(conn, adapter, device, TRUE);
1434 return btd_error_failed(msg, strerror(-err));
1440 if (err == -ENOTCONN) {
1441 /* Device is not connectable */
1442 const char *path = device_get_path(device);
1444 reply = dbus_message_new_method_return(msg);
1446 dbus_message_append_args(reply,
1447 DBUS_TYPE_OBJECT_PATH, &path,
1450 reply = btd_error_failed(msg, strerror(-err));
1455 static uint8_t parse_io_capability(const char *capability)
1457 if (g_str_equal(capability, ""))
1458 return IO_CAPABILITY_DISPLAYYESNO;
1459 if (g_str_equal(capability, "DisplayOnly"))
1460 return IO_CAPABILITY_DISPLAYONLY;
1461 if (g_str_equal(capability, "DisplayYesNo"))
1462 return IO_CAPABILITY_DISPLAYYESNO;
1463 if (g_str_equal(capability, "KeyboardOnly"))
1464 return IO_CAPABILITY_KEYBOARDONLY;
1465 if (g_str_equal(capability, "NoInputNoOutput"))
1466 return IO_CAPABILITY_NOINPUTNOOUTPUT;
1467 if (g_str_equal(capability, "KeyboardDisplay"))
1468 return IO_CAPABILITY_KEYBOARDDISPLAY;
1469 return IO_CAPABILITY_INVALID;
1472 static DBusMessage *create_paired_device(DBusConnection *conn,
1473 DBusMessage *msg, void *data)
1475 struct btd_adapter *adapter = data;
1476 struct btd_device *device;
1477 const gchar *address, *agent_path, *capability, *sender;
1481 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1482 DBUS_TYPE_OBJECT_PATH, &agent_path,
1483 DBUS_TYPE_STRING, &capability,
1484 DBUS_TYPE_INVALID) == FALSE)
1485 return btd_error_invalid_args(msg);
1487 if (check_address(address) < 0)
1488 return btd_error_invalid_args(msg);
1491 return btd_error_not_ready(msg);
1493 sender = dbus_message_get_sender(msg);
1494 if (adapter->agent &&
1495 agent_matches(adapter->agent, sender, agent_path)) {
1496 error("Refusing adapter agent usage as device specific one");
1497 return btd_error_invalid_args(msg);
1500 cap = parse_io_capability(capability);
1501 if (cap == IO_CAPABILITY_INVALID)
1502 return btd_error_invalid_args(msg);
1504 device = adapter_find_device(adapter, address);
1506 device = create_device_internal(conn, adapter, address, &err);
1508 return btd_error_failed(msg, strerror(-err));
1511 return device_create_bonding(device, conn, msg, agent_path, cap);
1514 static gint device_path_cmp(struct btd_device *device, const gchar *path)
1516 const gchar *dev_path = device_get_path(device);
1518 return strcasecmp(dev_path, path);
1521 static DBusMessage *remove_device(DBusConnection *conn, DBusMessage *msg,
1524 struct btd_adapter *adapter = data;
1525 struct btd_device *device;
1529 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1530 DBUS_TYPE_INVALID) == FALSE)
1531 return btd_error_invalid_args(msg);
1533 l = g_slist_find_custom(adapter->devices,
1534 path, (GCompareFunc) device_path_cmp);
1536 return btd_error_does_not_exist(msg);
1540 if (device_is_temporary(device) || device_is_busy(device))
1541 return g_dbus_create_error(msg,
1542 ERROR_INTERFACE ".DoesNotExist",
1543 "Device creation in progress");
1545 device_set_temporary(device, TRUE);
1547 if (!device_is_connected(device)) {
1548 adapter_remove_device(conn, adapter, device, TRUE);
1549 return dbus_message_new_method_return(msg);
1552 device_request_disconnect(device, msg);
1556 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
1559 struct btd_adapter *adapter = data;
1560 struct btd_device *device;
1562 const gchar *address;
1564 const gchar *dev_path;
1566 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1568 return btd_error_invalid_args(msg);
1570 l = g_slist_find_custom(adapter->devices,
1571 address, (GCompareFunc) device_address_cmp);
1573 return btd_error_does_not_exist(msg);
1577 reply = dbus_message_new_method_return(msg);
1581 dev_path = device_get_path(device);
1583 dbus_message_append_args(reply,
1584 DBUS_TYPE_OBJECT_PATH, &dev_path,
1590 static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
1592 adapter_ops->set_io_capability(adapter->dev_id,
1593 IO_CAPABILITY_NOINPUTNOOUTPUT);
1595 adapter->agent = NULL;
1598 static DBusMessage *register_agent(DBusConnection *conn, DBusMessage *msg,
1601 const char *path, *name, *capability;
1602 struct btd_adapter *adapter = data;
1605 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1606 DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID))
1610 return btd_error_already_exists(msg);
1612 cap = parse_io_capability(capability);
1613 if (cap == IO_CAPABILITY_INVALID)
1614 return btd_error_invalid_args(msg);
1616 name = dbus_message_get_sender(msg);
1618 adapter->agent = agent_create(adapter, name, path, cap,
1619 (agent_remove_cb) agent_removed, adapter);
1621 DBG("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
1624 adapter_ops->set_io_capability(adapter->dev_id, cap);
1626 return dbus_message_new_method_return(msg);
1629 static DBusMessage *unregister_agent(DBusConnection *conn, DBusMessage *msg,
1632 const char *path, *name;
1633 struct btd_adapter *adapter = data;
1635 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1639 name = dbus_message_get_sender(msg);
1641 if (!adapter->agent || !agent_matches(adapter->agent, name, path))
1642 return btd_error_does_not_exist(msg);
1644 agent_free(adapter->agent);
1645 adapter->agent = NULL;
1647 return dbus_message_new_method_return(msg);
1650 static const GDBusMethodTable adapter_methods[] = {
1651 { GDBUS_METHOD("GetProperties",
1652 NULL, GDBUS_ARGS({ "properties", "a{sv}" }),
1654 { GDBUS_ASYNC_METHOD("SetProperty",
1655 GDBUS_ARGS({ "name", "s" }, { "value", "v" }), NULL,
1657 { GDBUS_ASYNC_METHOD("RequestSession", NULL, NULL,
1659 { GDBUS_METHOD("ReleaseSession", NULL, NULL,
1661 { GDBUS_METHOD("StartDiscovery", NULL, NULL,
1662 adapter_start_discovery) },
1663 { GDBUS_ASYNC_METHOD("StopDiscovery", NULL, NULL,
1664 adapter_stop_discovery) },
1665 { GDBUS_DEPRECATED_METHOD("ListDevices",
1666 NULL, GDBUS_ARGS({ "devices", "ao" }),
1668 { GDBUS_ASYNC_METHOD("CreateDevice",
1669 GDBUS_ARGS({ "address", "s" }),
1670 GDBUS_ARGS({ "device", "o" }),
1672 { GDBUS_ASYNC_METHOD("CreatePairedDevice",
1673 GDBUS_ARGS({ "address", "s" }, { "agent", "o" },
1674 { "capability", "s" }),
1675 GDBUS_ARGS({ "device", "o" }),
1676 create_paired_device) },
1677 { GDBUS_ASYNC_METHOD("CancelDeviceCreation",
1678 GDBUS_ARGS({ "address", "s" }), NULL,
1679 cancel_device_creation) },
1680 { GDBUS_ASYNC_METHOD("RemoveDevice",
1681 GDBUS_ARGS({ "device", "o" }), NULL,
1683 { GDBUS_METHOD("FindDevice",
1684 GDBUS_ARGS({ "address", "s" }),
1685 GDBUS_ARGS({ "device", "o" }),
1687 { GDBUS_METHOD("RegisterAgent",
1688 GDBUS_ARGS({ "agent", "o" },
1689 { "capability", "s" }), NULL,
1691 { GDBUS_METHOD("UnregisterAgent",
1692 GDBUS_ARGS({ "agent", "o" }), NULL,
1693 unregister_agent) },
1697 static const GDBusSignalTable adapter_signals[] = {
1698 { GDBUS_SIGNAL("PropertyChanged",
1699 GDBUS_ARGS({ "name", "s" }, { "value", "v" })) },
1700 { GDBUS_SIGNAL("DeviceCreated",
1701 GDBUS_ARGS({ "device", "o" })) },
1702 { GDBUS_SIGNAL("DeviceRemoved",
1703 GDBUS_ARGS({ "device", "o" })) },
1704 { GDBUS_SIGNAL("DeviceFound",
1705 GDBUS_ARGS({ "address", "s" },
1706 { "values", "a{sv}" })) },
1707 { GDBUS_SIGNAL("DeviceDisappeared",
1708 GDBUS_ARGS({ "address", "s" })) },
1712 static void create_stored_device_from_profiles(char *key, char *value,
1715 struct btd_adapter *adapter = user_data;
1716 GSList *list, *uuids = bt_string2list(value);
1717 struct btd_device *device;
1719 if (g_slist_find_custom(adapter->devices,
1720 key, (GCompareFunc) device_address_cmp))
1723 device = device_create(connection, adapter, key, BDADDR_BREDR);
1727 device_set_temporary(device, FALSE);
1728 adapter->devices = g_slist_append(adapter->devices, device);
1730 list = device_services_from_record(device, uuids);
1732 device_register_services(connection, device, list, ATT_PSM);
1734 device_probe_drivers(device, uuids);
1736 g_slist_free_full(uuids, g_free);
1739 struct adapter_keys {
1740 struct btd_adapter *adapter;
1744 static int str2buf(const char *str, uint8_t *buf, size_t blen)
1751 memset(buf, 0, blen);
1753 dlen = MIN((strlen(str) / 2), blen);
1755 for (i = 0; i < dlen; i++)
1756 sscanf(str + (i * 2), "%02hhX", &buf[i]);
1761 static struct link_key_info *get_key_info(const char *addr, const char *value)
1763 struct link_key_info *info;
1767 if (strlen(value) < 36) {
1768 error("Unexpectedly short (%zu) link key line", strlen(value));
1772 info = g_new0(struct link_key_info, 1);
1774 str2ba(addr, &info->bdaddr);
1776 str2buf(value, info->key, sizeof(info->key));
1778 memcpy(tmp, value + 33, 2);
1779 info->type = (uint8_t) strtol(tmp, NULL, 10);
1781 memcpy(tmp, value + 35, 2);
1782 l = strtol(tmp, NULL, 10);
1790 static struct smp_ltk_info *get_ltk_info(const char *addr, uint8_t bdaddr_type,
1793 struct smp_ltk_info *ltk;
1797 if (strlen(value) < 60) {
1798 error("Unexpectedly short (%zu) LTK", strlen(value));
1802 ltk = g_new0(struct smp_ltk_info, 1);
1804 str2ba(addr, <k->bdaddr);
1806 ltk->bdaddr_type = bdaddr_type;
1808 str2buf(value, ltk->val, sizeof(ltk->val));
1810 ptr = (char *) value + 2 * sizeof(ltk->val) + 1;
1812 ret = sscanf(ptr, " %hhd %hhd %hhd %hd %n",
1813 <k->authenticated, <k->master, <k->enc_size,
1821 str2buf(ptr, ltk->rand, sizeof(ltk->rand));
1826 static void create_stored_device_from_linkkeys(char *key, char *value,
1829 struct adapter_keys *keys = user_data;
1830 struct btd_adapter *adapter = keys->adapter;
1831 struct btd_device *device;
1832 struct link_key_info *info;
1834 info = get_key_info(key, value);
1836 keys->keys = g_slist_append(keys->keys, info);
1838 if (g_slist_find_custom(adapter->devices, key,
1839 (GCompareFunc) device_address_cmp))
1842 device = device_create(connection, adapter, key, BDADDR_BREDR);
1844 device_set_temporary(device, FALSE);
1845 adapter->devices = g_slist_append(adapter->devices, device);
1849 static void create_stored_device_from_ltks(char *key, char *value,
1852 struct adapter_keys *keys = user_data;
1853 struct btd_adapter *adapter = keys->adapter;
1854 struct btd_device *device;
1855 struct smp_ltk_info *info;
1856 char address[18], srcaddr[18];
1857 uint8_t bdaddr_type;
1860 if (sscanf(key, "%17s#%hhu", address, &bdaddr_type) < 2)
1863 info = get_ltk_info(address, bdaddr_type, value);
1867 keys->keys = g_slist_append(keys->keys, info);
1869 if (g_slist_find_custom(adapter->devices, address,
1870 (GCompareFunc) device_address_cmp))
1873 adapter_get_address(adapter, &src);
1874 ba2str(&src, srcaddr);
1876 if (g_strcmp0(srcaddr, address) == 0)
1879 device = device_create(connection, adapter, address, bdaddr_type);
1881 device_set_temporary(device, FALSE);
1882 adapter->devices = g_slist_append(adapter->devices, device);
1886 static void create_stored_device_from_blocked(char *key, char *value,
1889 struct btd_adapter *adapter = user_data;
1890 struct btd_device *device;
1892 if (g_slist_find_custom(adapter->devices,
1893 key, (GCompareFunc) device_address_cmp))
1896 device = device_create(connection, adapter, key, BDADDR_BREDR);
1898 device_set_temporary(device, FALSE);
1899 adapter->devices = g_slist_append(adapter->devices, device);
1903 static GSList *string_to_primary_list(char *str)
1912 services = g_strsplit(str, " ", 0);
1913 if (services == NULL)
1916 for (i = 0; services[i]; i++) {
1917 struct gatt_primary *prim;
1920 prim = g_new0(struct gatt_primary, 1);
1922 ret = sscanf(services[i], "%04hX#%04hX#%s", &prim->range.start,
1923 &prim->range.end, prim->uuid);
1930 l = g_slist_append(l, prim);
1933 g_strfreev(services);
1938 static void create_stored_device_from_primaries(char *key, char *value,
1941 struct btd_adapter *adapter = user_data;
1942 struct btd_device *device;
1943 GSList *services, *uuids, *l;
1945 uint8_t bdaddr_type;
1947 if (sscanf(key, "%17s#%hhu", address, &bdaddr_type) < 2)
1950 if (g_slist_find_custom(adapter->devices,
1951 address, (GCompareFunc) device_address_cmp))
1954 device = device_create(connection, adapter, address, bdaddr_type);
1958 device_set_temporary(device, FALSE);
1959 adapter->devices = g_slist_append(adapter->devices, device);
1961 services = string_to_primary_list(value);
1962 if (services == NULL)
1965 for (l = services, uuids = NULL; l; l = l->next) {
1966 struct gatt_primary *prim = l->data;
1967 uuids = g_slist_append(uuids, prim->uuid);
1970 device_register_services(connection, device, services, -1);
1972 device_probe_drivers(device, uuids);
1974 g_slist_free(uuids);
1977 static void smp_key_free(void *data)
1979 struct smp_ltk_info *info = data;
1984 static void load_devices(struct btd_adapter *adapter)
1986 char filename[PATH_MAX + 1];
1988 struct adapter_keys keys = { adapter, NULL };
1991 ba2str(&adapter->bdaddr, srcaddr);
1993 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "profiles");
1994 textfile_foreach(filename, create_stored_device_from_profiles,
1997 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "primaries");
1998 textfile_foreach(filename, create_stored_device_from_primaries,
2001 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
2002 textfile_foreach(filename, create_stored_device_from_linkkeys, &keys);
2004 err = adapter_ops->load_keys(adapter->dev_id, keys.keys,
2005 main_opts.debug_keys);
2007 error("Unable to load keys to adapter_ops: %s (%d)",
2008 strerror(-err), -err);
2010 g_slist_free_full(keys.keys, g_free);
2013 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "longtermkeys");
2014 textfile_foreach(filename, create_stored_device_from_ltks, &keys);
2016 err = adapter_ops->load_ltks(adapter->dev_id, keys.keys);
2018 error("Unable to load keys to adapter_ops: %s (%d)",
2019 strerror(-err), -err);
2020 g_slist_free_full(keys.keys, smp_key_free);
2023 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "blocked");
2024 textfile_foreach(filename, create_stored_device_from_blocked, adapter);
2027 int btd_adapter_block_address(struct btd_adapter *adapter, bdaddr_t *bdaddr,
2028 uint8_t bdaddr_type)
2030 return adapter_ops->block_device(adapter->dev_id, bdaddr, bdaddr_type);
2033 int btd_adapter_unblock_address(struct btd_adapter *adapter, bdaddr_t *bdaddr,
2034 uint8_t bdaddr_type)
2036 return adapter_ops->unblock_device(adapter->dev_id, bdaddr,
2040 static void clear_blocked(struct btd_adapter *adapter)
2044 err = adapter_ops->unblock_device(adapter->dev_id, BDADDR_ANY, 0);
2046 error("Clearing blocked list failed: %s (%d)",
2047 strerror(-err), -err);
2050 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
2052 struct btd_adapter_driver *driver = user_data;
2055 if (driver->probe == NULL)
2058 err = driver->probe(adapter);
2060 error("%s: %s (%d)", driver->name, strerror(-err), -err);
2064 adapter->loaded_drivers = g_slist_prepend(adapter->loaded_drivers,
2068 static void load_drivers(struct btd_adapter *adapter)
2072 for (l = adapter_drivers; l; l = l->next)
2073 probe_driver(adapter, l->data);
2076 static void load_connections(struct btd_adapter *adapter)
2081 err = adapter_ops->get_conn_list(adapter->dev_id, &conns);
2083 error("Unable to fetch existing connections: %s (%d)",
2084 strerror(-err), -err);
2088 for (l = conns; l != NULL; l = g_slist_next(l)) {
2089 bdaddr_t *bdaddr = l->data;
2090 struct btd_device *device;
2093 ba2str(bdaddr, address);
2094 DBG("Adding existing connection to %s", address);
2096 device = adapter_get_device(connection, adapter, address);
2098 adapter_add_connection(adapter, device);
2101 g_slist_free_full(conns, g_free);
2104 static int get_discoverable_timeout(const char *src)
2108 if (read_discoverable_timeout(src, &timeout) == 0)
2111 return main_opts.discovto;
2114 static int get_pairable_timeout(const char *src)
2118 if (read_pairable_timeout(src, &timeout) == 0)
2121 return main_opts.pairto;
2124 static void call_adapter_powered_callbacks(struct btd_adapter *adapter,
2129 for (l = adapter->powered_callbacks; l; l = l->next) {
2130 btd_adapter_powered_cb cb = l->data;
2132 cb(adapter, powered);
2136 static void emit_device_disappeared(gpointer data, gpointer user_data)
2138 struct remote_dev_info *dev = data;
2139 struct btd_adapter *adapter = user_data;
2141 const char *paddr = address;
2143 ba2str(&dev->bdaddr, address);
2145 g_dbus_emit_signal(connection, adapter->path,
2146 ADAPTER_INTERFACE, "DeviceDisappeared",
2147 DBUS_TYPE_STRING, &paddr,
2150 adapter->found_devices = g_slist_remove(adapter->found_devices, dev);
2153 void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
2155 uint16_t *discoverable_timeout,
2158 char str[14], address[18];
2160 ba2str(&adapter->bdaddr, address);
2163 if (main_opts.remember_powered == FALSE)
2164 *mode = main_opts.mode;
2165 else if (read_device_mode(address, str, sizeof(str)) == 0)
2166 *mode = get_mode(&adapter->bdaddr, str);
2168 *mode = main_opts.mode;
2172 *on_mode = get_mode(&adapter->bdaddr, "on");
2174 if (discoverable_timeout)
2175 *discoverable_timeout = get_discoverable_timeout(address);
2178 *pairable = adapter->pairable;
2181 void btd_adapter_get_class(struct btd_adapter *adapter, uint8_t *major,
2186 if (read_local_class(&adapter->bdaddr, cls) < 0) {
2187 uint32_t class = htobl(main_opts.class);
2188 memcpy(cls, &class, 3);
2195 const char *btd_adapter_get_name(struct btd_adapter *adapter)
2197 return adapter->name;
2200 void btd_adapter_start(struct btd_adapter *adapter)
2205 ba2str(&adapter->bdaddr, address);
2207 adapter->dev_class = 0;
2208 adapter->off_requested = FALSE;
2210 adapter->discov_timeout = get_discoverable_timeout(address);
2211 adapter->pairable_timeout = get_pairable_timeout(address);
2212 adapter->off_timer = 0;
2214 if (adapter->scan_mode & SCAN_INQUIRY)
2215 adapter->mode = MODE_DISCOVERABLE;
2217 adapter->mode = MODE_CONNECTABLE;
2220 emit_property_changed(connection, adapter->path,
2221 ADAPTER_INTERFACE, "Powered",
2222 DBUS_TYPE_BOOLEAN, &powered);
2224 call_adapter_powered_callbacks(adapter, TRUE);
2226 adapter_ops->disable_cod_cache(adapter->dev_id);
2228 info("Adapter %s has been enabled", adapter->path);
2231 static void reply_pending_requests(struct btd_adapter *adapter)
2238 /* pending bonding */
2239 for (l = adapter->devices; l; l = l->next) {
2240 struct btd_device *device = l->data;
2242 if (device_is_bonding(device, NULL))
2243 device_cancel_bonding(device,
2244 HCI_OE_USER_ENDED_CONNECTION);
2248 static void remove_driver(gpointer data, gpointer user_data)
2250 struct btd_adapter_driver *driver = data;
2251 struct btd_adapter *adapter = user_data;
2254 driver->remove(adapter);
2257 static void unload_drivers(struct btd_adapter *adapter)
2259 g_slist_foreach(adapter->loaded_drivers, remove_driver, adapter);
2260 g_slist_free(adapter->loaded_drivers);
2261 adapter->loaded_drivers = NULL;
2264 static void set_mode_complete(struct btd_adapter *adapter)
2266 struct session_req *pending;
2267 const char *modestr;
2270 modestr = mode2str(adapter->mode);
2271 write_device_mode(&adapter->bdaddr, modestr);
2275 if (adapter->mode == MODE_OFF) {
2276 g_slist_free_full(adapter->mode_sessions, session_free);
2277 adapter->mode_sessions = NULL;
2280 if (adapter->pending_mode == NULL)
2283 pending = adapter->pending_mode;
2284 adapter->pending_mode = NULL;
2286 err = (pending->mode != adapter->mode) ? -EINVAL : 0;
2288 if (pending->msg != NULL) {
2289 DBusMessage *msg = pending->msg;
2293 reply = btd_error_failed(msg, strerror(-err));
2295 if (strcmp(dbus_message_get_member(msg),
2296 "SetProperty") == 0)
2297 adapter->global_mode = adapter->mode;
2298 reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
2301 g_dbus_send_message(connection, reply);
2305 error("unable to set mode: %s", mode2str(pending->mode));
2307 session_unref(pending);
2310 int btd_adapter_stop(struct btd_adapter *adapter)
2312 gboolean prop_false = FALSE;
2314 /* check pending requests */
2315 reply_pending_requests(adapter);
2317 adapter->up = FALSE;
2319 stop_discovery(adapter);
2321 if (adapter->disc_sessions) {
2322 g_slist_free_full(adapter->disc_sessions, session_free);
2323 adapter->disc_sessions = NULL;
2326 while (adapter->connections) {
2327 struct btd_device *device = adapter->connections->data;
2328 adapter_remove_connection(adapter, device);
2331 if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY))
2332 emit_property_changed(connection, adapter->path,
2333 ADAPTER_INTERFACE, "Discoverable",
2334 DBUS_TYPE_BOOLEAN, &prop_false);
2336 if ((adapter->scan_mode & SCAN_PAGE) && adapter->pairable == TRUE)
2337 emit_property_changed(connection, adapter->path,
2338 ADAPTER_INTERFACE, "Pairable",
2339 DBUS_TYPE_BOOLEAN, &prop_false);
2341 if (adapter->discovering)
2342 emit_property_changed(connection, adapter->path,
2343 ADAPTER_INTERFACE, "Discovering",
2344 DBUS_TYPE_BOOLEAN, &prop_false);
2346 emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2347 "Powered", DBUS_TYPE_BOOLEAN, &prop_false);
2349 adapter->discovering = FALSE;
2350 adapter->scan_mode = SCAN_DISABLED;
2351 adapter->mode = MODE_OFF;
2352 adapter->off_requested = FALSE;
2354 call_adapter_powered_callbacks(adapter, FALSE);
2356 info("Adapter %s has been disabled", adapter->path);
2358 set_mode_complete(adapter);
2363 static void off_timer_remove(struct btd_adapter *adapter)
2365 g_source_remove(adapter->off_timer);
2366 adapter->off_timer = 0;
2369 static void adapter_free(gpointer user_data)
2371 struct btd_adapter *adapter = user_data;
2373 agent_free(adapter->agent);
2374 adapter->agent = NULL;
2378 if (adapter->auth_idle_id)
2379 g_source_remove(adapter->auth_idle_id);
2381 if (adapter->off_timer)
2382 off_timer_remove(adapter);
2384 sdp_list_free(adapter->services, NULL);
2386 g_slist_free_full(adapter->found_devices, dev_info_free);
2388 g_slist_free(adapter->oor_devices);
2390 g_free(adapter->path);
2391 g_free(adapter->name);
2395 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
2399 DBG("%p: ref=%d", adapter, adapter->ref);
2404 void btd_adapter_unref(struct btd_adapter *adapter)
2410 DBG("%p: ref=%d", adapter, adapter->ref);
2412 if (adapter->ref > 0)
2415 path = g_strdup(adapter->path);
2417 g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2422 gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
2426 adapter->allow_name_changes = TRUE;
2428 adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
2430 if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
2431 error("No address available for hci%d", adapter->dev_id);
2435 sdp_init_services_list(&adapter->bdaddr);
2437 if (main_opts.gatt_enabled)
2438 btd_adapter_gatt_server_start(adapter);
2440 load_drivers(adapter);
2441 clear_blocked(adapter);
2442 load_devices(adapter);
2444 /* Set pairable mode */
2445 if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
2446 adapter->pairable = TRUE;
2448 /* retrieve the active connections: address the scenario where
2449 * the are active connections before the daemon've started */
2450 load_connections(adapter);
2452 adapter->initialized = TRUE;
2457 struct btd_adapter *adapter_create(DBusConnection *conn, int id)
2459 char path[MAX_PATH_LENGTH];
2460 struct btd_adapter *adapter;
2461 const char *base_path = manager_get_base_path();
2466 adapter = g_try_new0(struct btd_adapter, 1);
2468 error("adapter_create: failed to alloc memory for hci%d", id);
2472 adapter->dev_id = id;
2474 snprintf(path, sizeof(path), "%s/hci%d", base_path, id);
2475 adapter->path = g_strdup(path);
2477 if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2478 adapter_methods, adapter_signals, NULL,
2479 adapter, adapter_free)) {
2480 error("Adapter interface init failed on path %s", path);
2481 adapter_free(adapter);
2485 return btd_adapter_ref(adapter);
2488 void adapter_remove(struct btd_adapter *adapter)
2492 DBG("Removing adapter %s", adapter->path);
2494 for (l = adapter->devices; l; l = l->next)
2495 device_remove(l->data, FALSE);
2496 g_slist_free(adapter->devices);
2498 unload_drivers(adapter);
2499 if (main_opts.gatt_enabled)
2500 btd_adapter_gatt_server_stop(adapter);
2502 g_slist_free(adapter->pin_callbacks);
2504 /* Return adapter to down state if it was not up on init */
2505 adapter_ops->restore_powered(adapter->dev_id);
2508 uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2510 return adapter->dev_id;
2513 const gchar *adapter_get_path(struct btd_adapter *adapter)
2518 return adapter->path;
2521 void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2523 bacpy(bdaddr, &adapter->bdaddr);
2526 void adapter_set_allow_name_changes(struct btd_adapter *adapter,
2527 gboolean allow_name_changes)
2529 adapter->allow_name_changes = allow_name_changes;
2532 void adapter_set_discovering(struct btd_adapter *adapter,
2533 gboolean discovering)
2535 const char *path = adapter->path;
2537 adapter->discovering = discovering;
2539 emit_property_changed(connection, path,
2540 ADAPTER_INTERFACE, "Discovering",
2541 DBUS_TYPE_BOOLEAN, &discovering);
2546 g_slist_foreach(adapter->oor_devices, emit_device_disappeared, adapter);
2547 g_slist_free_full(adapter->oor_devices, dev_info_free);
2548 adapter->oor_devices = g_slist_copy(adapter->found_devices);
2550 if (!adapter_has_discov_sessions(adapter) || adapter->discov_suspended)
2553 DBG("hci%u restarting discovery, disc_sessions %u", adapter->dev_id,
2554 g_slist_length(adapter->disc_sessions));
2556 adapter->discov_id = g_idle_add(discovery_cb, adapter);
2559 static void suspend_discovery(struct btd_adapter *adapter)
2561 if (adapter->disc_sessions == NULL || adapter->discov_suspended)
2564 DBG("Suspending discovery");
2566 if (adapter->oor_devices) {
2567 g_slist_free(adapter->oor_devices);
2568 adapter->oor_devices = NULL;
2571 adapter->discov_suspended = TRUE;
2573 if (adapter->discov_id > 0) {
2574 g_source_remove(adapter->discov_id);
2575 adapter->discov_id = 0;
2577 adapter_ops->stop_discovery(adapter->dev_id);
2580 static int found_device_cmp(gconstpointer a, gconstpointer b)
2582 const struct remote_dev_info *d = a;
2583 const bdaddr_t *bdaddr = b;
2585 if (bacmp(bdaddr, BDADDR_ANY) == 0)
2588 return bacmp(&d->bdaddr, bdaddr);
2591 struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
2596 l = g_slist_find_custom(adapter->found_devices, bdaddr,
2604 static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
2608 rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
2609 rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
2611 return rssi1 - rssi2;
2614 static void append_dict_valist(DBusMessageIter *iter,
2615 const char *first_key,
2618 DBusMessageIter dict;
2624 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
2625 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2626 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
2627 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
2631 type = va_arg(var_args, int);
2632 val = va_arg(var_args, void *);
2633 if (type == DBUS_TYPE_ARRAY) {
2634 n_elements = va_arg(var_args, int);
2636 dict_append_array(&dict, key, DBUS_TYPE_STRING,
2639 dict_append_entry(&dict, key, type, val);
2640 key = va_arg(var_args, char *);
2643 dbus_message_iter_close_container(iter, &dict);
2646 static void emit_device_found(const char *path, const char *address,
2647 const char *first_key, ...)
2649 DBusMessage *signal;
2650 DBusMessageIter iter;
2653 signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
2656 error("Unable to allocate new %s.DeviceFound signal",
2660 dbus_message_iter_init_append(signal, &iter);
2661 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
2663 va_start(var_args, first_key);
2664 append_dict_valist(&iter, first_key, var_args);
2667 g_dbus_send_message(connection, signal);
2670 static char **strlist2array(GSList *list)
2678 n = g_slist_length(list);
2679 array = g_new0(char *, n + 1);
2681 for (i = 0; list; list = list->next, i++)
2682 array[i] = g_strdup((const gchar *) list->data);
2687 void adapter_emit_device_found(struct btd_adapter *adapter,
2688 struct remote_dev_info *dev)
2690 struct btd_device *device;
2691 char peer_addr[18], local_addr[18];
2692 const char *icon, *paddr = peer_addr;
2693 dbus_bool_t paired = FALSE, trusted = FALSE;
2694 dbus_int16_t rssi = dev->rssi;
2698 ba2str(&dev->bdaddr, peer_addr);
2699 ba2str(&adapter->bdaddr, local_addr);
2701 device = adapter_find_device(adapter, paddr);
2703 paired = device_is_paired(device);
2704 trusted = device_is_trusted(device);
2707 /* The uuids string array is updated only if necessary */
2708 uuid_count = g_slist_length(dev->services);
2709 if (dev->services && dev->uuid_count != uuid_count) {
2710 g_strfreev(dev->uuids);
2711 dev->uuids = strlist2array(dev->services);
2712 dev->uuid_count = uuid_count;
2717 alias = g_strdup(peer_addr);
2718 g_strdelimit(alias, ":", '-');
2720 alias = g_strdup(dev->name);
2722 alias = g_strdup(dev->alias);
2724 if (dev->bdaddr_type != BDADDR_BREDR) {
2725 gboolean broadcaster;
2728 if (dev->flags & (EIR_LIM_DISC | EIR_GEN_DISC))
2729 broadcaster = FALSE;
2733 dev->legacy = FALSE;
2735 if (read_remote_appearance(&adapter->bdaddr, &dev->bdaddr,
2736 dev->bdaddr_type, &app) == 0)
2737 icon = gap_appearance_to_icon(app);
2741 emit_device_found(adapter->path, paddr,
2742 "Address", DBUS_TYPE_STRING, &paddr,
2743 "Class", DBUS_TYPE_UINT32, &dev->class,
2744 "Icon", DBUS_TYPE_STRING, &icon,
2745 "RSSI", DBUS_TYPE_INT16, &rssi,
2746 "Name", DBUS_TYPE_STRING, &dev->name,
2747 "Alias", DBUS_TYPE_STRING, &alias,
2748 "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2749 "Paired", DBUS_TYPE_BOOLEAN, &paired,
2750 "Broadcaster", DBUS_TYPE_BOOLEAN, &broadcaster,
2751 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2754 icon = class_to_icon(dev->class);
2756 emit_device_found(adapter->path, paddr,
2757 "Address", DBUS_TYPE_STRING, &paddr,
2758 "Class", DBUS_TYPE_UINT32, &dev->class,
2759 "Icon", DBUS_TYPE_STRING, &icon,
2760 "RSSI", DBUS_TYPE_INT16, &rssi,
2761 "Name", DBUS_TYPE_STRING, &dev->name,
2762 "Alias", DBUS_TYPE_STRING, &alias,
2763 "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2764 "Paired", DBUS_TYPE_BOOLEAN, &paired,
2765 "Trusted", DBUS_TYPE_BOOLEAN, &trusted,
2766 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2773 static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
2774 uint8_t bdaddr_type, const char *name,
2775 const char *alias, uint32_t class,
2776 gboolean legacy, int flags)
2778 struct remote_dev_info *dev;
2780 dev = g_new0(struct remote_dev_info, 1);
2781 bacpy(&dev->bdaddr, bdaddr);
2782 dev->bdaddr_type = bdaddr_type;
2783 dev->name = g_strdup(name);
2784 dev->alias = g_strdup(alias);
2786 dev->legacy = legacy;
2793 static void remove_same_uuid(gpointer data, gpointer user_data)
2795 struct remote_dev_info *dev = user_data;
2798 for (l = dev->services; l; l = l->next) {
2799 char *current_uuid = l->data;
2800 char *new_uuid = data;
2802 if (strcmp(current_uuid, new_uuid) == 0) {
2803 g_free(current_uuid);
2804 dev->services = g_slist_delete_link(dev->services, l);
2810 static void dev_prepend_uuid(gpointer data, gpointer user_data)
2812 struct remote_dev_info *dev = user_data;
2813 char *new_uuid = data;
2815 dev->services = g_slist_prepend(dev->services, g_strdup(new_uuid));
2818 static gboolean pairing_is_legacy(bdaddr_t *local, bdaddr_t *peer,
2819 const uint8_t *eir, const char *name)
2821 unsigned char features[8];
2829 if (read_remote_features(local, peer, NULL, features) < 0)
2832 if (features[0] & 0x01)
2838 static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer, const char *file)
2840 char local_addr[18], peer_addr[18], filename[PATH_MAX + 1];
2842 ba2str(local, local_addr);
2843 ba2str(peer, peer_addr);
2845 create_name(filename, PATH_MAX, STORAGEDIR, local_addr, file);
2847 return textfile_get(filename, peer_addr);
2850 void adapter_update_found_devices(struct btd_adapter *adapter,
2851 bdaddr_t *bdaddr, uint8_t bdaddr_type,
2852 int8_t rssi, uint8_t confirm_name,
2853 uint8_t *data, uint8_t data_len)
2855 struct remote_dev_info *dev;
2856 struct eir_data eir_data;
2858 gboolean legacy, name_known;
2862 memset(&eir_data, 0, sizeof(eir_data));
2863 err = eir_parse(&eir_data, data, data_len);
2865 error("Error parsing EIR data: %s (%d)", strerror(-err), -err);
2869 dev_class = eir_data.dev_class[0] | (eir_data.dev_class[1] << 8) |
2870 (eir_data.dev_class[2] << 16);
2872 write_remote_class(&adapter->bdaddr, bdaddr, dev_class);
2874 if (eir_data.appearance != 0)
2875 write_remote_appearance(&adapter->bdaddr, bdaddr, bdaddr_type,
2876 eir_data.appearance);
2878 if (eir_data.name != NULL && eir_data.name_complete)
2879 write_device_name(&adapter->bdaddr, bdaddr, eir_data.name);
2881 dev = adapter_search_found_devices(adapter, bdaddr);
2883 adapter->oor_devices = g_slist_remove(adapter->oor_devices,
2886 /* If an existing device had no name but the newly received EIR
2887 * data has (complete or not), we want to present it to the
2889 if (dev->name == NULL && eir_data.name != NULL) {
2890 dev->name = g_strdup(eir_data.name);
2894 if (dev->rssi != rssi)
2897 eir_data_free(&eir_data);
2902 /* New device in the discovery session */
2904 name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
2906 if (bdaddr_type == BDADDR_BREDR) {
2907 legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
2910 if (!name && main_opts.name_resolv &&
2911 adapter_has_discov_sessions(adapter))
2921 adapter_ops->confirm_name(adapter->dev_id, bdaddr, bdaddr_type,
2924 alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
2926 dev = found_device_new(bdaddr, bdaddr_type, name, alias, dev_class,
2927 legacy, eir_data.flags);
2931 adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
2936 adapter->found_devices = g_slist_sort(adapter->found_devices,
2937 (GCompareFunc) dev_rssi_cmp);
2939 g_slist_foreach(eir_data.services, remove_same_uuid, dev);
2940 g_slist_foreach(eir_data.services, dev_prepend_uuid, dev);
2942 adapter_emit_device_found(adapter, dev);
2944 eir_data_free(&eir_data);
2947 void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
2949 const gchar *path = adapter_get_path(adapter);
2950 gboolean discoverable, pairable;
2952 DBG("old 0x%02x new 0x%02x", adapter->scan_mode, scan_mode);
2954 if (adapter->scan_mode == scan_mode)
2957 switch (scan_mode) {
2959 adapter->mode = MODE_OFF;
2960 discoverable = FALSE;
2964 adapter->mode = MODE_CONNECTABLE;
2965 discoverable = FALSE;
2966 pairable = adapter->pairable;
2968 case (SCAN_PAGE | SCAN_INQUIRY):
2969 adapter->mode = MODE_DISCOVERABLE;
2970 discoverable = TRUE;
2971 pairable = adapter->pairable;
2974 /* ignore, reserved */
2978 /* If page scanning gets toggled emit the Pairable property */
2979 if ((adapter->scan_mode & SCAN_PAGE) != (scan_mode & SCAN_PAGE))
2980 emit_property_changed(connection, adapter->path,
2981 ADAPTER_INTERFACE, "Pairable",
2982 DBUS_TYPE_BOOLEAN, &pairable);
2984 emit_property_changed(connection, path,
2985 ADAPTER_INTERFACE, "Discoverable",
2986 DBUS_TYPE_BOOLEAN, &discoverable);
2988 adapter->scan_mode = scan_mode;
2990 set_mode_complete(adapter);
2993 struct agent *adapter_get_agent(struct btd_adapter *adapter)
2998 return adapter->agent;
3001 void adapter_add_connection(struct btd_adapter *adapter,
3002 struct btd_device *device)
3004 if (g_slist_find(adapter->connections, device)) {
3005 error("Device is already marked as connected");
3009 device_add_connection(device, connection);
3011 adapter->connections = g_slist_append(adapter->connections, device);
3014 void adapter_remove_connection(struct btd_adapter *adapter,
3015 struct btd_device *device)
3019 if (!g_slist_find(adapter->connections, device)) {
3020 error("No matching connection for device");
3024 device_remove_connection(device, connection);
3026 adapter->connections = g_slist_remove(adapter->connections, device);
3028 if (device_is_authenticating(device))
3029 device_cancel_authentication(device, TRUE);
3031 if (device_is_temporary(device)) {
3032 const char *path = device_get_path(device);
3034 DBG("Removing temporary device %s", path);
3035 adapter_remove_device(connection, adapter, device, TRUE);
3039 gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
3041 if (!adapter || !adapter->disc_sessions)
3047 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
3049 adapter_drivers = g_slist_append(adapter_drivers, driver);
3051 if (driver->probe == NULL)
3054 manager_foreach_adapter(probe_driver, driver);
3059 static void unload_driver(struct btd_adapter *adapter, gpointer data)
3061 adapter->loaded_drivers = g_slist_remove(adapter->loaded_drivers, data);
3064 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
3066 adapter_drivers = g_slist_remove(adapter_drivers, driver);
3068 manager_foreach_adapter(unload_driver, driver);
3071 static void agent_auth_cb(struct agent *agent, DBusError *derr,
3074 struct service_auth *auth = user_data;
3076 device_set_authorizing(auth->device, FALSE);
3078 auth->cb(derr, auth->user_data);
3081 static gboolean auth_idle_cb(gpointer user_data)
3083 struct service_auth *auth = user_data;
3084 struct btd_adapter *adapter = auth->adapter;
3086 adapter->auth_idle_id = 0;
3088 auth->cb(NULL, auth->user_data);
3093 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
3094 const char *uuid, service_auth_cb cb,
3097 struct service_auth *auth;
3098 struct btd_device *device;
3099 struct agent *agent;
3101 const gchar *dev_path;
3104 ba2str(dst, address);
3105 device = adapter_find_device(adapter, address);
3109 /* Device connected? */
3110 if (!g_slist_find(adapter->connections, device))
3111 error("Authorization request for non-connected device!?");
3113 if (adapter->auth_idle_id)
3116 auth = g_try_new0(struct service_auth, 1);
3121 auth->user_data = user_data;
3122 auth->device = device;
3123 auth->adapter = adapter;
3125 if (device_is_trusted(device) == TRUE) {
3126 adapter->auth_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
3132 agent = device_get_agent(device);
3134 warn("Can't find device agent");
3139 dev_path = device_get_path(device);
3141 err = agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth, g_free);
3145 device_set_authorizing(device, TRUE);
3150 int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3151 const char *uuid, service_auth_cb cb,
3154 struct btd_adapter *adapter;
3157 if (bacmp(src, BDADDR_ANY) != 0) {
3158 adapter = manager_find_adapter(src);
3162 return adapter_authorize(adapter, dst, uuid, cb, user_data);
3165 for (l = manager_get_adapters(); l != NULL; l = g_slist_next(l)) {
3170 err = adapter_authorize(adapter, dst, uuid, cb, user_data);
3178 int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3180 struct btd_adapter *adapter = manager_find_adapter(src);
3181 struct btd_device *device;
3182 struct agent *agent;
3189 ba2str(dst, address);
3190 device = adapter_find_device(adapter, address);
3194 if (adapter->auth_idle_id) {
3195 g_source_remove(adapter->auth_idle_id);
3196 adapter->auth_idle_id = 0;
3201 * FIXME: Cancel fails if authorization is requested to adapter's
3202 * agent and in the meanwhile CreatePairedDevice is called.
3205 agent = device_get_agent(device);
3209 err = agent_cancel(agent);
3212 device_set_authorizing(device, FALSE);
3217 static gchar *adapter_any_path = NULL;
3218 static int adapter_any_refcount = 0;
3220 const char *adapter_any_get_path(void)
3222 return adapter_any_path;
3225 const char *btd_adapter_any_request_path(void)
3227 if (adapter_any_refcount++ > 0)
3228 return adapter_any_path;
3230 adapter_any_path = g_strdup_printf("%s/any", manager_get_base_path());
3232 return adapter_any_path;
3235 void btd_adapter_any_release_path(void)
3237 adapter_any_refcount--;
3239 if (adapter_any_refcount > 0)
3242 g_free(adapter_any_path);
3243 adapter_any_path = NULL;
3246 gboolean adapter_powering_down(struct btd_adapter *adapter)
3248 return adapter->off_requested;
3251 int btd_adapter_restore_powered(struct btd_adapter *adapter)
3253 char mode[14], address[18];
3258 if (!main_opts.remember_powered)
3264 ba2str(&adapter->bdaddr, address);
3265 if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
3266 g_str_equal(mode, "off"))
3269 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3272 static gboolean switch_off_timeout(gpointer user_data)
3274 struct btd_adapter *adapter = user_data;
3276 adapter_ops->set_powered(adapter->dev_id, FALSE);
3277 adapter->off_timer = 0;
3282 int btd_adapter_switch_online(struct btd_adapter *adapter)
3290 if (adapter->off_timer)
3291 off_timer_remove(adapter);
3293 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3296 int btd_adapter_switch_offline(struct btd_adapter *adapter)
3304 if (adapter->off_timer)
3307 adapter->global_mode = MODE_OFF;
3309 if (adapter->connections == NULL)
3310 return adapter_ops->set_powered(adapter->dev_id, FALSE);
3312 g_slist_foreach(adapter->connections,
3313 (GFunc) device_request_disconnect, NULL);
3315 adapter->off_timer = g_timeout_add_seconds(OFF_TIMER,
3316 switch_off_timeout, adapter);
3321 static gboolean disable_auto(gpointer user_data)
3323 struct btd_adapter *adapter = user_data;
3326 for (l = adapter->devices; l; l = l->next) {
3327 struct btd_device *device = l->data;
3329 device_set_auto_connect(device, FALSE);
3332 adapter->auto_timeout_id = 0;
3337 static void set_auto_connect(gpointer data, gpointer user_data)
3339 struct btd_device *device = data;
3341 device_set_auto_connect(device, TRUE);
3344 void btd_adapter_enable_auto_connect(struct btd_adapter *adapter)
3349 DBG("Enabling automatic connections");
3351 if (adapter->auto_timeout_id)
3354 g_slist_foreach(adapter->devices, set_auto_connect, NULL);
3356 adapter->auto_timeout_id = g_timeout_add_seconds(main_opts.autoto,
3357 disable_auto, adapter);
3360 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
3361 btd_adapter_pin_cb_t cb)
3363 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
3366 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
3367 btd_adapter_pin_cb_t cb)
3369 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
3372 ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
3373 char *pin_buf, gboolean *display)
3376 btd_adapter_pin_cb_t cb;
3380 for (l = adapter->pin_callbacks; l != NULL; l = g_slist_next(l)) {
3382 ret = cb(adapter, dev, pin_buf, display);
3387 adapter_get_address(adapter, &sba);
3388 device_get_address(dev, &dba, NULL);
3390 return read_pin_code(&sba, &dba, pin_buf);
3393 int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
3395 if (ops->setup == NULL)
3399 ops_candidates = g_slist_prepend(ops_candidates, ops);
3401 ops_candidates = g_slist_append(ops_candidates, ops);
3406 void btd_adapter_cleanup_ops(struct btd_adapter_ops *ops)
3408 ops_candidates = g_slist_remove(ops_candidates, ops);
3411 if (adapter_ops == ops)
3415 int adapter_ops_setup(void)
3420 if (!ops_candidates)
3423 for (l = ops_candidates; l != NULL; l = g_slist_next(l)) {
3424 struct btd_adapter_ops *ops = l->data;
3437 void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
3438 btd_adapter_powered_cb cb)
3440 adapter->powered_callbacks =
3441 g_slist_append(adapter->powered_callbacks, cb);
3444 void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
3445 btd_adapter_powered_cb cb)
3447 adapter->powered_callbacks =
3448 g_slist_remove(adapter->powered_callbacks, cb);
3451 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
3460 return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
3463 int btd_adapter_read_clock(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3464 int which, int timeout, uint32_t *clock,
3473 return adapter_ops->read_clock(adapter->dev_id, bdaddr, which,
3474 timeout, clock, accuracy);
3477 int btd_adapter_disconnect_device(struct btd_adapter *adapter,
3478 bdaddr_t *bdaddr, uint8_t bdaddr_type)
3481 return adapter_ops->disconnect(adapter->dev_id, bdaddr, bdaddr_type);
3484 int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3485 uint8_t bdaddr_type)
3487 return adapter_ops->remove_bonding(adapter->dev_id, bdaddr,
3491 int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3492 const char *pin, size_t pin_len)
3494 return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin,
3498 int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3499 uint8_t bdaddr_type, gboolean success)
3501 return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, bdaddr_type,
3505 int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3506 uint8_t bdaddr_type, uint32_t passkey)
3508 return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, bdaddr_type,
3512 int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3513 bt_hci_result_t cb, gpointer user_data)
3515 return adapter_ops->encrypt_link(adapter->dev_id, bdaddr, cb, user_data);
3518 int btd_adapter_set_did(struct btd_adapter *adapter, uint16_t vendor,
3519 uint16_t product, uint16_t version,
3522 return adapter_ops->set_did(adapter->dev_id, vendor, product, version,
3526 int adapter_create_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3527 uint8_t addr_type, uint8_t io_cap)
3529 suspend_discovery(adapter);
3530 return adapter_ops->create_bonding(adapter->dev_id, bdaddr,
3534 int adapter_cancel_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3536 return adapter_ops->cancel_bonding(adapter->dev_id, bdaddr);
3539 void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3542 struct btd_device *device;
3545 ba2str(bdaddr, addr);
3547 device = adapter_get_device(connection, adapter, addr);
3549 device = adapter_find_device(adapter, addr);
3552 device_bonding_complete(device, status);
3554 if (adapter->discov_suspended) {
3555 adapter->discov_suspended = FALSE;
3556 adapter_ops->start_discovery(adapter->dev_id);
3560 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
3562 return adapter_ops->read_local_oob_data(adapter->dev_id);
3565 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
3566 bdaddr_t *bdaddr, uint8_t *hash, uint8_t *randomizer)
3568 return adapter_ops->add_remote_oob_data(adapter->dev_id, bdaddr, hash,
3572 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
3575 return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);