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-compat.h"
56 #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_INVALID 0xFF
79 #define check_address(address) bachk(address)
83 static DBusConnection *connection = NULL;
84 static GSList *adapter_drivers = NULL;
86 static GSList *ops_candidates = NULL;
88 const struct btd_adapter_ops *adapter_ops = NULL;
91 struct btd_adapter *adapter;
92 DBusConnection *conn; /* Connection reference */
93 DBusMessage *msg; /* Unreplied message ref */
94 char *owner; /* Bus name of the owner */
95 guint id; /* Listener id */
96 uint8_t mode; /* Requested mode */
97 int refcount; /* Session refcount */
98 gboolean got_reply; /* Agent reply received */
101 struct service_auth {
104 struct btd_device *device;
105 struct btd_adapter *adapter;
111 char *path; /* adapter object path */
112 bdaddr_t bdaddr; /* adapter Bluetooth Address */
113 uint32_t dev_class; /* Class of Device */
114 char *name; /* adapter name */
115 gboolean allow_name_changes; /* whether the adapter name can be changed */
116 guint discov_timeout_id; /* discoverable timeout id */
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 void adapter_set_limited_discoverable(struct btd_adapter *adapter,
212 DBG("%s", limited ? "TRUE" : "FALSE");
214 adapter_ops->set_limited_discoverable(adapter->dev_id, limited);
217 static void adapter_remove_discov_timeout(struct btd_adapter *adapter)
222 if (adapter->discov_timeout_id == 0)
225 g_source_remove(adapter->discov_timeout_id);
226 adapter->discov_timeout_id = 0;
229 static gboolean discov_timeout_handler(gpointer user_data)
231 struct btd_adapter *adapter = user_data;
233 adapter->discov_timeout_id = 0;
235 adapter_ops->set_discoverable(adapter->dev_id, FALSE);
240 static void adapter_set_discov_timeout(struct btd_adapter *adapter,
243 if (adapter->discov_timeout_id) {
244 g_source_remove(adapter->discov_timeout_id);
245 adapter->discov_timeout_id = 0;
249 adapter_set_limited_discoverable(adapter, FALSE);
253 /* Set limited discoverable if pairable and interval between 0 to 60
255 if (adapter->pairable && interval <= 60)
256 adapter_set_limited_discoverable(adapter, TRUE);
258 adapter_set_limited_discoverable(adapter, FALSE);
260 adapter->discov_timeout_id = g_timeout_add_seconds(interval,
261 discov_timeout_handler,
265 static struct session_req *session_ref(struct session_req *req)
269 DBG("%p: ref=%d", req, req->refcount);
274 static struct session_req *create_session(struct btd_adapter *adapter,
275 DBusConnection *conn, DBusMessage *msg,
276 uint8_t mode, GDBusWatchFunction cb)
278 const char *sender = dbus_message_get_sender(msg);
279 struct session_req *req;
281 req = g_new0(struct session_req, 1);
282 req->adapter = adapter;
283 req->conn = dbus_connection_ref(conn);
284 req->msg = dbus_message_ref(msg);
288 return session_ref(req);
290 req->owner = g_strdup(sender);
291 req->id = g_dbus_add_disconnect_watch(conn, sender, cb, req, NULL);
293 info("%s session %p with %s activated",
294 req->mode ? "Mode" : "Discovery", req, sender);
296 return session_ref(req);
299 static int adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
303 if (mode == MODE_CONNECTABLE)
304 err = adapter_ops->set_discoverable(adapter->dev_id, FALSE);
306 err = adapter_ops->set_discoverable(adapter->dev_id, TRUE);
311 if (mode == MODE_CONNECTABLE)
314 adapter_remove_discov_timeout(adapter);
316 if (adapter->discov_timeout)
317 adapter_set_discov_timeout(adapter, adapter->discov_timeout);
322 static struct session_req *find_session_by_msg(GSList *list, const DBusMessage *msg)
324 for (; list; list = list->next) {
325 struct session_req *req = list->data;
334 static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
340 if (adapter->pending_mode != NULL)
343 if (!adapter->up && new_mode != MODE_OFF) {
344 err = adapter_ops->set_powered(adapter->dev_id, TRUE);
351 if (adapter->up && new_mode == MODE_OFF) {
352 err = adapter_ops->set_powered(adapter->dev_id, FALSE);
356 adapter->off_requested = TRUE;
361 if (new_mode == adapter->mode)
364 err = adapter_set_mode(adapter, new_mode);
370 modestr = mode2str(new_mode);
371 write_device_mode(&adapter->bdaddr, modestr);
376 struct session_req *req;
378 req = find_session_by_msg(adapter->mode_sessions, msg);
380 adapter->pending_mode = req;
383 /* Wait for mode change to reply */
384 adapter->pending_mode = create_session(adapter,
385 connection, msg, new_mode, NULL);
387 /* Nothing to reply just write the new mode */
388 adapter->mode = new_mode;
393 static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
394 gboolean discoverable, void *data)
396 struct btd_adapter *adapter = data;
400 mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
402 if (mode == adapter->mode) {
403 adapter->global_mode = mode;
404 return dbus_message_new_method_return(msg);
407 err = set_mode(adapter, mode, msg);
409 return btd_error_failed(msg, strerror(-err));
414 static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
415 gboolean powered, void *data)
417 struct btd_adapter *adapter = data;
420 #ifdef __SAMSUNG_PATCH__
421 mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF;
424 mode = get_mode(&adapter->bdaddr, "on");
425 return set_discoverable(conn, msg, mode == MODE_DISCOVERABLE,
431 if (mode == adapter->mode) {
432 adapter->global_mode = mode;
433 return dbus_message_new_method_return(msg);
436 err = set_mode(adapter, mode, msg);
438 return btd_error_failed(msg, strerror(-err));
443 static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
444 gboolean pairable, void *data)
446 struct btd_adapter *adapter = data;
449 if (adapter->scan_mode == SCAN_DISABLED)
450 return btd_error_not_ready(msg);
452 if (pairable == adapter->pairable)
455 if (!(adapter->scan_mode & SCAN_INQUIRY))
458 err = set_mode(adapter, MODE_DISCOVERABLE, NULL);
460 return btd_error_failed(msg, strerror(-err));
463 adapter_ops->set_pairable(adapter->dev_id, pairable);
466 return msg ? dbus_message_new_method_return(msg) : NULL;
469 static gboolean pairable_timeout_handler(void *data)
471 set_pairable(NULL, NULL, FALSE, data);
476 static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
479 if (adapter->pairable_timeout_id) {
480 g_source_remove(adapter->pairable_timeout_id);
481 adapter->pairable_timeout_id = 0;
487 adapter->pairable_timeout_id = g_timeout_add_seconds(interval,
488 pairable_timeout_handler,
492 void btd_adapter_pairable_changed(struct btd_adapter *adapter,
495 adapter->pairable = pairable;
497 write_device_pairable(&adapter->bdaddr, pairable);
499 emit_property_changed(connection, adapter->path,
500 ADAPTER_INTERFACE, "Pairable",
501 DBUS_TYPE_BOOLEAN, &pairable);
503 if (pairable && adapter->pairable_timeout)
504 adapter_set_pairable_timeout(adapter,
505 adapter->pairable_timeout);
508 static struct session_req *find_session(GSList *list, const char *sender)
510 for (; list; list = list->next) {
511 struct session_req *req = list->data;
513 if (g_str_equal(req->owner, sender))
520 static uint8_t get_needed_mode(struct btd_adapter *adapter, uint8_t mode)
524 if (adapter->global_mode > mode)
525 mode = adapter->global_mode;
527 for (l = adapter->mode_sessions; l; l = l->next) {
528 struct session_req *req = l->data;
530 if (req->mode > mode)
537 static GSList *remove_bredr(GSList *all)
541 for (l = all, le = NULL; l; l = l->next) {
542 struct remote_dev_info *dev = l->data;
543 if (dev->type == ADDR_TYPE_BREDR) {
548 le = g_slist_append(le, dev);
556 /* Called when a session gets removed or the adapter is stopped */
557 static void stop_discovery(struct btd_adapter *adapter)
559 adapter->found_devices = remove_bredr(adapter->found_devices);
561 if (adapter->oor_devices) {
562 g_slist_free(adapter->oor_devices);
563 adapter->oor_devices = NULL;
566 /* Reset if suspended, otherwise remove timer (software scheduler)
567 * or request inquiry to stop */
568 if (adapter->discov_suspended) {
569 adapter->discov_suspended = FALSE;
573 if (adapter->discov_id > 0) {
574 g_source_remove(adapter->discov_id);
575 adapter->discov_id = 0;
579 adapter_ops->stop_discovery(adapter->dev_id);
582 static void session_remove(struct session_req *req)
584 struct btd_adapter *adapter = req->adapter;
586 /* Ignore set_mode session */
587 if (req->owner == NULL)
590 DBG("%s session %p with %s deactivated",
591 req->mode ? "Mode" : "Discovery", req, req->owner);
596 adapter->mode_sessions = g_slist_remove(adapter->mode_sessions,
599 mode = get_needed_mode(adapter, adapter->global_mode);
601 if (mode == adapter->mode)
604 DBG("Switching to '%s' mode", mode2str(mode));
606 set_mode(adapter, mode, NULL);
608 adapter->disc_sessions = g_slist_remove(adapter->disc_sessions,
611 if (adapter->disc_sessions)
614 DBG("Stopping discovery");
616 stop_discovery(adapter);
620 static void session_free(void *data)
622 struct session_req *req = data;
625 g_dbus_remove_watch(req->conn, req->id);
628 dbus_message_unref(req->msg);
629 if (!req->got_reply && req->mode && req->adapter->agent)
630 agent_cancel(req->adapter->agent);
634 dbus_connection_unref(req->conn);
639 static void session_owner_exit(DBusConnection *conn, void *user_data)
641 struct session_req *req = user_data;
649 static void session_unref(struct session_req *req)
653 DBG("%p: ref=%d", req, req->refcount);
662 static void confirm_mode_cb(struct agent *agent, DBusError *derr, void *data)
664 struct session_req *req = data;
668 req->got_reply = TRUE;
670 if (derr && dbus_error_is_set(derr)) {
671 reply = dbus_message_new_error(req->msg, derr->name,
673 g_dbus_send_message(req->conn, reply);
678 err = set_mode(req->adapter, req->mode, req->msg);
680 reply = btd_error_failed(req->msg, strerror(-err));
681 else if (!req->adapter->pending_mode)
682 reply = dbus_message_new_method_return(req->msg);
688 * Send reply immediately only if there was an error changing
689 * mode, or change is not needed. Otherwise, reply is sent in
692 g_dbus_send_message(req->conn, reply);
694 dbus_message_unref(req->msg);
698 if (!find_session(req->adapter->mode_sessions, req->owner))
702 static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
707 struct btd_adapter *adapter = data;
710 if (adapter->discov_timeout == timeout && timeout == 0)
711 return dbus_message_new_method_return(msg);
713 if (adapter->scan_mode & SCAN_INQUIRY)
714 adapter_set_discov_timeout(adapter, timeout);
716 adapter->discov_timeout = timeout;
718 write_discoverable_timeout(&adapter->bdaddr, timeout);
720 path = dbus_message_get_path(msg);
722 emit_property_changed(conn, path,
723 ADAPTER_INTERFACE, "DiscoverableTimeout",
724 DBUS_TYPE_UINT32, &timeout);
726 return dbus_message_new_method_return(msg);
729 static DBusMessage *set_pairable_timeout(DBusConnection *conn,
734 struct btd_adapter *adapter = data;
737 if (adapter->pairable_timeout == timeout && timeout == 0)
738 return dbus_message_new_method_return(msg);
740 if (adapter->pairable)
741 adapter_set_pairable_timeout(adapter, timeout);
743 adapter->pairable_timeout = timeout;
745 write_pairable_timeout(&adapter->bdaddr, timeout);
747 path = dbus_message_get_path(msg);
749 emit_property_changed(conn, path,
750 ADAPTER_INTERFACE, "PairableTimeout",
751 DBUS_TYPE_UINT32, &timeout);
753 return dbus_message_new_method_return(msg);
756 void btd_adapter_class_changed(struct btd_adapter *adapter, uint32_t new_class)
760 class[2] = (new_class >> 16) & 0xff;
761 class[1] = (new_class >> 8) & 0xff;
762 class[0] = new_class & 0xff;
764 write_local_class(&adapter->bdaddr, class);
766 adapter->dev_class = new_class;
768 if (main_opts.attrib_server) {
769 /* Removes service class */
770 class[1] = class[1] & 0x1f;
771 attrib_gap_set(adapter, GATT_CHARAC_APPEARANCE, class, 2);
774 emit_property_changed(connection, adapter->path,
775 ADAPTER_INTERFACE, "Class",
776 DBUS_TYPE_UINT32, &new_class);
779 void adapter_name_changed(struct btd_adapter *adapter, const char *name)
781 if (g_strcmp0(adapter->name, name) == 0)
784 g_free(adapter->name);
785 adapter->name = g_strdup(name);
788 emit_property_changed(connection, adapter->path,
789 ADAPTER_INTERFACE, "Name",
790 DBUS_TYPE_STRING, &name);
792 if (main_opts.attrib_server)
793 attrib_gap_set(adapter, GATT_CHARAC_DEVICE_NAME,
794 (const uint8_t *) name, strlen(name));
797 int adapter_set_name(struct btd_adapter *adapter, const char *name)
799 char maxname[MAX_NAME_LENGTH + 1];
801 if (g_strcmp0(adapter->name, name) == 0)
804 memset(maxname, 0, sizeof(maxname));
805 strncpy(maxname, name, MAX_NAME_LENGTH);
806 if (!g_utf8_validate(maxname, -1, NULL)) {
807 error("Name change failed: supplied name isn't valid UTF-8");
812 int err = adapter_ops->set_name(adapter->dev_id, maxname);
817 write_local_name(&adapter->bdaddr, maxname);
822 static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
823 const char *name, void *data)
825 struct btd_adapter *adapter = data;
828 if (adapter->allow_name_changes == FALSE)
829 return btd_error_failed(msg, strerror(EPERM));
831 ret = adapter_set_name(adapter, name);
833 return btd_error_invalid_args(msg);
835 return btd_error_failed(msg, strerror(-ret));
837 return dbus_message_new_method_return(msg);
840 struct btd_device *adapter_find_device(struct btd_adapter *adapter,
843 struct btd_device *device;
849 l = g_slist_find_custom(adapter->devices, dest,
850 (GCompareFunc) device_address_cmp);
859 static void adapter_update_devices(struct btd_adapter *adapter)
866 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
867 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
868 struct btd_device *dev = l->data;
869 devices[i] = (char *) device_get_path(dev);
872 emit_array_property_changed(connection, adapter->path,
873 ADAPTER_INTERFACE, "Devices",
874 DBUS_TYPE_OBJECT_PATH, &devices, i);
878 static void adapter_emit_uuids_updated(struct btd_adapter *adapter)
884 if (!adapter->initialized)
887 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
889 for (i = 0, list = adapter->services; list; list = list->next) {
891 sdp_record_t *rec = list->data;
893 uuid = bt_uuid2string(&rec->svclass);
898 emit_array_property_changed(connection, adapter->path,
899 ADAPTER_INTERFACE, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
904 static uint8_t get_uuid_mask(uuid_t *uuid)
906 if (uuid->type != SDP_UUID16)
909 switch (uuid->value.uuid16) {
910 case DIALUP_NET_SVCLASS_ID:
912 return 0x42; /* Telephony & Networking */
913 case IRMC_SYNC_SVCLASS_ID:
914 case OBEX_OBJPUSH_SVCLASS_ID:
915 case OBEX_FILETRANS_SVCLASS_ID:
916 case IRMC_SYNC_CMD_SVCLASS_ID:
917 case PBAP_PSE_SVCLASS_ID:
918 return 0x10; /* Object Transfer */
919 case HEADSET_SVCLASS_ID:
920 case HANDSFREE_SVCLASS_ID:
921 return 0x20; /* Audio */
922 case CORDLESS_TELEPHONY_SVCLASS_ID:
923 case INTERCOM_SVCLASS_ID:
927 * Setting the telephony bit for the handsfree audio gateway
928 * role is not required by the HFP specification, but the
929 * Nokia 616 carkit is just plain broken! It will refuse
930 * pairing without this bit set.
932 case HANDSFREE_AGW_SVCLASS_ID:
933 return 0x40; /* Telephony */
934 case AUDIO_SOURCE_SVCLASS_ID:
935 case VIDEO_SOURCE_SVCLASS_ID:
936 return 0x08; /* Capturing */
937 case AUDIO_SINK_SVCLASS_ID:
938 case VIDEO_SINK_SVCLASS_ID:
939 return 0x04; /* Rendering */
940 case PANU_SVCLASS_ID:
943 return 0x02; /* Networking */
949 static int uuid_cmp(const void *a, const void *b)
951 const sdp_record_t *rec = a;
952 const uuid_t *uuid = b;
954 return sdp_uuid_cmp(&rec->svclass, uuid);
957 void adapter_service_insert(struct btd_adapter *adapter, void *r)
959 sdp_record_t *rec = r;
962 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
967 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
971 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
972 adapter_ops->add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
975 adapter_emit_uuids_updated(adapter);
978 void adapter_service_remove(struct btd_adapter *adapter, void *r)
980 sdp_record_t *rec = r;
982 adapter->services = sdp_list_remove(adapter->services, rec);
984 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
985 adapter_ops->remove_uuid(adapter->dev_id, &rec->svclass);
987 adapter_emit_uuids_updated(adapter);
990 static struct btd_device *adapter_create_device(DBusConnection *conn,
991 struct btd_adapter *adapter,
995 struct btd_device *device;
1000 device = device_create(conn, adapter, address, type);
1004 device_set_temporary(device, TRUE);
1006 adapter->devices = g_slist_append(adapter->devices, device);
1008 path = device_get_path(device);
1009 g_dbus_emit_signal(conn, adapter->path,
1010 ADAPTER_INTERFACE, "DeviceCreated",
1011 DBUS_TYPE_OBJECT_PATH, &path,
1014 adapter_update_devices(adapter);
1019 void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
1020 struct btd_device *device,
1021 gboolean remove_storage)
1023 const gchar *dev_path = device_get_path(device);
1024 struct agent *agent;
1026 adapter->devices = g_slist_remove(adapter->devices, device);
1027 adapter->connections = g_slist_remove(adapter->connections, device);
1029 adapter_update_devices(adapter);
1031 g_dbus_emit_signal(conn, adapter->path,
1032 ADAPTER_INTERFACE, "DeviceRemoved",
1033 DBUS_TYPE_OBJECT_PATH, &dev_path,
1036 agent = device_get_agent(device);
1038 if (agent && device_is_authorizing(device))
1039 agent_cancel(agent);
1041 device_remove(device, remove_storage);
1044 struct btd_device *adapter_get_device(DBusConnection *conn,
1045 struct btd_adapter *adapter,
1046 const gchar *address)
1048 struct btd_device *device;
1055 device = adapter_find_device(adapter, address);
1059 return adapter_create_device(conn, adapter, address,
1063 static gboolean discovery_cb(gpointer user_data)
1065 struct btd_adapter *adapter = user_data;
1068 adapter->discov_id = 0;
1070 err = adapter_ops->start_discovery(adapter->dev_id);
1072 error("start_discovery: %s (%d)", strerror(-err), -err);
1077 static DBusMessage *adapter_start_discovery(DBusConnection *conn,
1078 DBusMessage *msg, void *data)
1080 struct session_req *req;
1081 struct btd_adapter *adapter = data;
1082 const char *sender = dbus_message_get_sender(msg);
1086 return btd_error_not_ready(msg);
1088 req = find_session(adapter->disc_sessions, sender);
1091 return dbus_message_new_method_return(msg);
1094 if (adapter->disc_sessions)
1097 g_slist_free_full(adapter->found_devices, dev_info_free);
1098 adapter->found_devices = NULL;
1100 g_slist_free(adapter->oor_devices);
1101 adapter->oor_devices = NULL;
1103 if (adapter->discov_suspended)
1106 err = adapter_ops->start_discovery(adapter->dev_id);
1108 return btd_error_failed(msg, strerror(-err));
1111 req = create_session(adapter, conn, msg, 0,
1112 session_owner_exit);
1114 adapter->disc_sessions = g_slist_append(adapter->disc_sessions, req);
1116 return dbus_message_new_method_return(msg);
1119 static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
1120 DBusMessage *msg, void *data)
1122 struct btd_adapter *adapter = data;
1123 struct session_req *req;
1124 const char *sender = dbus_message_get_sender(msg);
1127 return btd_error_not_ready(msg);
1129 req = find_session(adapter->disc_sessions, sender);
1131 return btd_error_failed(msg, "Invalid discovery session");
1134 info("Stopping discovery");
1135 return dbus_message_new_method_return(msg);
1138 static DBusMessage *get_properties(DBusConnection *conn,
1139 DBusMessage *msg, void *data)
1141 struct btd_adapter *adapter = data;
1142 const char *property;
1144 DBusMessageIter iter;
1145 DBusMessageIter dict;
1148 char **devices, **uuids;
1153 ba2str(&adapter->bdaddr, srcaddr);
1155 if (check_address(srcaddr) < 0)
1156 return btd_error_invalid_args(msg);
1158 reply = dbus_message_new_method_return(msg);
1162 dbus_message_iter_init_append(reply, &iter);
1164 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1165 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1166 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
1167 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1171 dict_append_entry(&dict, "Address", DBUS_TYPE_STRING, &property);
1174 property = adapter->name ? : "";
1176 dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &property);
1179 dict_append_entry(&dict, "Class",
1180 DBUS_TYPE_UINT32, &adapter->dev_class);
1183 value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE;
1184 dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value);
1187 value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
1188 dict_append_entry(&dict, "Discoverable", DBUS_TYPE_BOOLEAN, &value);
1191 dict_append_entry(&dict, "Pairable", DBUS_TYPE_BOOLEAN,
1192 &adapter->pairable);
1194 /* DiscoverableTimeout */
1195 dict_append_entry(&dict, "DiscoverableTimeout",
1196 DBUS_TYPE_UINT32, &adapter->discov_timeout);
1198 /* PairableTimeout */
1199 dict_append_entry(&dict, "PairableTimeout",
1200 DBUS_TYPE_UINT32, &adapter->pairable_timeout);
1204 dict_append_entry(&dict, "Discovering", DBUS_TYPE_BOOLEAN,
1205 &adapter->discovering);
1208 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1209 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1210 struct btd_device *dev = l->data;
1211 devices[i] = (char *) device_get_path(dev);
1213 dict_append_array(&dict, "Devices", DBUS_TYPE_OBJECT_PATH,
1218 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
1220 for (i = 0, list = adapter->services; list; list = list->next) {
1221 sdp_record_t *rec = list->data;
1224 uuid = bt_uuid2string(&rec->svclass);
1229 dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
1233 dbus_message_iter_close_container(&iter, &dict);
1238 static DBusMessage *set_property(DBusConnection *conn,
1239 DBusMessage *msg, void *data)
1241 struct btd_adapter *adapter = data;
1242 DBusMessageIter iter;
1243 DBusMessageIter sub;
1244 const char *property;
1247 ba2str(&adapter->bdaddr, srcaddr);
1249 if (!dbus_message_iter_init(msg, &iter))
1250 return btd_error_invalid_args(msg);
1252 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1253 return btd_error_invalid_args(msg);
1255 dbus_message_iter_get_basic(&iter, &property);
1256 dbus_message_iter_next(&iter);
1258 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1259 return btd_error_invalid_args(msg);
1260 dbus_message_iter_recurse(&iter, &sub);
1262 if (g_str_equal("Name", property)) {
1265 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1266 return btd_error_invalid_args(msg);
1267 dbus_message_iter_get_basic(&sub, &name);
1269 return set_name(conn, msg, name, data);
1270 } else if (g_str_equal("Powered", property)) {
1273 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1274 return btd_error_invalid_args(msg);
1276 dbus_message_iter_get_basic(&sub, &powered);
1278 return set_powered(conn, msg, powered, data);
1279 } else if (g_str_equal("Discoverable", property)) {
1280 gboolean discoverable;
1282 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1283 return btd_error_invalid_args(msg);
1285 dbus_message_iter_get_basic(&sub, &discoverable);
1287 return set_discoverable(conn, msg, discoverable, data);
1288 } else if (g_str_equal("DiscoverableTimeout", property)) {
1291 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1292 return btd_error_invalid_args(msg);
1294 dbus_message_iter_get_basic(&sub, &timeout);
1296 return set_discoverable_timeout(conn, msg, timeout, data);
1297 } else if (g_str_equal("Pairable", property)) {
1300 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1301 return btd_error_invalid_args(msg);
1303 dbus_message_iter_get_basic(&sub, &pairable);
1305 return set_pairable(conn, msg, pairable, data);
1306 } else if (g_str_equal("PairableTimeout", property)) {
1309 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1310 return btd_error_invalid_args(msg);
1312 dbus_message_iter_get_basic(&sub, &timeout);
1314 return set_pairable_timeout(conn, msg, timeout, data);
1317 return btd_error_invalid_args(msg);
1320 static DBusMessage *request_session(DBusConnection *conn,
1321 DBusMessage *msg, void *data)
1323 struct btd_adapter *adapter = data;
1324 struct session_req *req;
1325 const char *sender = dbus_message_get_sender(msg);
1329 if (!adapter->agent)
1330 return btd_error_agent_not_available(msg);
1332 if (!adapter->mode_sessions)
1333 adapter->global_mode = adapter->mode;
1335 new_mode = get_mode(&adapter->bdaddr, "on");
1337 req = find_session(adapter->mode_sessions, sender);
1340 return dbus_message_new_method_return(msg);
1342 req = create_session(adapter, conn, msg, new_mode,
1343 session_owner_exit);
1344 adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1348 /* No need to change mode */
1349 if (adapter->mode >= new_mode)
1350 return dbus_message_new_method_return(msg);
1352 err = agent_confirm_mode_change(adapter->agent, mode2str(new_mode),
1353 confirm_mode_cb, req, NULL);
1356 return btd_error_failed(msg, strerror(-err));
1362 static DBusMessage *release_session(DBusConnection *conn,
1363 DBusMessage *msg, void *data)
1365 struct btd_adapter *adapter = data;
1366 struct session_req *req;
1367 const char *sender = dbus_message_get_sender(msg);
1369 req = find_session(adapter->mode_sessions, sender);
1371 return btd_error_failed(msg, "Invalid Session");
1375 return dbus_message_new_method_return(msg);
1378 static DBusMessage *list_devices(DBusConnection *conn,
1379 DBusMessage *msg, void *data)
1381 struct btd_adapter *adapter = data;
1384 DBusMessageIter iter;
1385 DBusMessageIter array_iter;
1386 const gchar *dev_path;
1388 if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
1389 return btd_error_invalid_args(msg);
1391 reply = dbus_message_new_method_return(msg);
1395 dbus_message_iter_init_append(reply, &iter);
1396 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1397 DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
1399 for (l = adapter->devices; l; l = l->next) {
1400 struct btd_device *device = l->data;
1402 dev_path = device_get_path(device);
1404 dbus_message_iter_append_basic(&array_iter,
1405 DBUS_TYPE_OBJECT_PATH, &dev_path);
1408 dbus_message_iter_close_container(&iter, &array_iter);
1413 static DBusMessage *cancel_device_creation(DBusConnection *conn,
1414 DBusMessage *msg, void *data)
1416 struct btd_adapter *adapter = data;
1417 const gchar *address, *sender = dbus_message_get_sender(msg);
1418 struct btd_device *device;
1420 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1421 DBUS_TYPE_INVALID) == FALSE)
1422 return btd_error_invalid_args(msg);
1424 if (check_address(address) < 0)
1425 return btd_error_invalid_args(msg);
1427 device = adapter_find_device(adapter, address);
1428 if (!device || !device_is_creating(device, NULL))
1429 return btd_error_does_not_exist(msg);
1431 if (!device_is_creating(device, sender))
1432 return btd_error_not_authorized(msg);
1434 device_set_temporary(device, TRUE);
1436 if (device_is_connected(device)) {
1437 device_request_disconnect(device, msg);
1441 adapter_remove_device(conn, adapter, device, TRUE);
1443 return dbus_message_new_method_return(msg);
1446 static struct btd_device *create_device_internal(DBusConnection *conn,
1447 struct btd_adapter *adapter,
1448 const char *address, int *err)
1450 struct remote_dev_info *dev;
1451 struct btd_device *device;
1455 str2ba(address, &addr);
1457 dev = adapter_search_found_devices(adapter, &addr);
1461 type = ADDR_TYPE_BREDR;
1463 device = adapter_create_device(conn, adapter, address, type);
1470 static DBusMessage *create_device(DBusConnection *conn,
1471 DBusMessage *msg, void *data)
1473 struct btd_adapter *adapter = data;
1474 struct btd_device *device;
1475 const gchar *address;
1479 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1480 DBUS_TYPE_INVALID) == FALSE)
1481 return btd_error_invalid_args(msg);
1483 if (check_address(address) < 0)
1484 return btd_error_invalid_args(msg);
1487 return btd_error_not_ready(msg);
1489 if (adapter_find_device(adapter, address))
1490 return btd_error_already_exists(msg);
1494 device = create_device_internal(conn, adapter, address, &err);
1498 if (device_is_bredr(device))
1499 err = device_browse_sdp(device, conn, msg, NULL, FALSE);
1501 err = device_browse_primary(device, conn, msg, FALSE);
1504 adapter_remove_device(conn, adapter, device, TRUE);
1505 return btd_error_failed(msg, strerror(-err));
1511 if (err == -ENOTCONN) {
1512 /* Device is not connectable */
1513 const char *path = device_get_path(device);
1515 reply = dbus_message_new_method_return(msg);
1517 dbus_message_append_args(reply,
1518 DBUS_TYPE_OBJECT_PATH, &path,
1521 reply = btd_error_failed(msg, strerror(-err));
1526 static uint8_t parse_io_capability(const char *capability)
1528 if (g_str_equal(capability, ""))
1529 return IO_CAPABILITY_DISPLAYYESNO;
1530 if (g_str_equal(capability, "DisplayOnly"))
1531 return IO_CAPABILITY_DISPLAYONLY;
1532 if (g_str_equal(capability, "DisplayYesNo"))
1533 return IO_CAPABILITY_DISPLAYYESNO;
1534 if (g_str_equal(capability, "KeyboardOnly"))
1535 return IO_CAPABILITY_KEYBOARDONLY;
1536 if (g_str_equal(capability, "NoInputNoOutput"))
1537 return IO_CAPABILITY_NOINPUTNOOUTPUT;
1538 return IO_CAPABILITY_INVALID;
1541 static DBusMessage *create_paired_device(DBusConnection *conn,
1542 DBusMessage *msg, void *data)
1544 struct btd_adapter *adapter = data;
1545 struct btd_device *device;
1546 const gchar *address, *agent_path, *capability, *sender;
1550 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1551 DBUS_TYPE_OBJECT_PATH, &agent_path,
1552 DBUS_TYPE_STRING, &capability,
1553 DBUS_TYPE_INVALID) == FALSE)
1554 return btd_error_invalid_args(msg);
1556 if (check_address(address) < 0)
1557 return btd_error_invalid_args(msg);
1560 return btd_error_not_ready(msg);
1562 sender = dbus_message_get_sender(msg);
1563 if (adapter->agent &&
1564 agent_matches(adapter->agent, sender, agent_path)) {
1565 error("Refusing adapter agent usage as device specific one");
1566 return btd_error_invalid_args(msg);
1569 cap = parse_io_capability(capability);
1570 if (cap == IO_CAPABILITY_INVALID)
1571 return btd_error_invalid_args(msg);
1573 device = adapter_find_device(adapter, address);
1575 device = create_device_internal(conn, adapter, address, &err);
1577 return btd_error_failed(msg, strerror(-err));
1580 if (device_is_bredr(device))
1581 return device_create_bonding(device, conn, msg,
1584 err = device_browse_primary(device, conn, msg, TRUE);
1586 return btd_error_failed(msg, strerror(-err));
1591 static gint device_path_cmp(struct btd_device *device, const gchar *path)
1593 const gchar *dev_path = device_get_path(device);
1595 return strcasecmp(dev_path, path);
1598 static DBusMessage *remove_device(DBusConnection *conn, DBusMessage *msg,
1601 struct btd_adapter *adapter = data;
1602 struct btd_device *device;
1606 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1607 DBUS_TYPE_INVALID) == FALSE)
1608 return btd_error_invalid_args(msg);
1610 l = g_slist_find_custom(adapter->devices,
1611 path, (GCompareFunc) device_path_cmp);
1613 return btd_error_does_not_exist(msg);
1617 if (device_is_temporary(device) || device_is_busy(device))
1618 return g_dbus_create_error(msg,
1619 ERROR_INTERFACE ".DoesNotExist",
1620 "Device creation in progress");
1622 device_set_temporary(device, TRUE);
1624 if (!device_is_connected(device)) {
1625 adapter_remove_device(conn, adapter, device, TRUE);
1626 return dbus_message_new_method_return(msg);
1629 device_request_disconnect(device, msg);
1633 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
1636 struct btd_adapter *adapter = data;
1637 struct btd_device *device;
1639 const gchar *address;
1641 const gchar *dev_path;
1643 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1645 return btd_error_invalid_args(msg);
1647 l = g_slist_find_custom(adapter->devices,
1648 address, (GCompareFunc) device_address_cmp);
1650 return btd_error_does_not_exist(msg);
1654 reply = dbus_message_new_method_return(msg);
1658 dev_path = device_get_path(device);
1660 dbus_message_append_args(reply,
1661 DBUS_TYPE_OBJECT_PATH, &dev_path,
1667 static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
1669 adapter_ops->set_io_capability(adapter->dev_id,
1670 IO_CAPABILITY_NOINPUTNOOUTPUT);
1672 adapter->agent = NULL;
1675 static DBusMessage *register_agent(DBusConnection *conn, DBusMessage *msg,
1678 const char *path, *name, *capability;
1679 struct agent *agent;
1680 struct btd_adapter *adapter = data;
1683 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1684 DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID))
1688 return btd_error_already_exists(msg);
1690 cap = parse_io_capability(capability);
1691 if (cap == IO_CAPABILITY_INVALID)
1692 return btd_error_invalid_args(msg);
1694 name = dbus_message_get_sender(msg);
1696 agent = agent_create(adapter, name, path, cap,
1697 (agent_remove_cb) agent_removed, adapter);
1699 return btd_error_failed(msg, "Failed to create a new agent");
1701 adapter->agent = agent;
1703 DBG("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
1706 adapter_ops->set_io_capability(adapter->dev_id, cap);
1708 return dbus_message_new_method_return(msg);
1711 static DBusMessage *unregister_agent(DBusConnection *conn, DBusMessage *msg,
1714 const char *path, *name;
1715 struct btd_adapter *adapter = data;
1717 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1721 name = dbus_message_get_sender(msg);
1723 if (!adapter->agent || !agent_matches(adapter->agent, name, path))
1724 return btd_error_does_not_exist(msg);
1726 agent_free(adapter->agent);
1727 adapter->agent = NULL;
1729 return dbus_message_new_method_return(msg);
1732 static GDBusMethodTable adapter_methods[] = {
1733 { "GetProperties", "", "a{sv}",get_properties },
1734 { "SetProperty", "sv", "", set_property,
1735 G_DBUS_METHOD_FLAG_ASYNC},
1736 { "RequestSession", "", "", request_session,
1737 G_DBUS_METHOD_FLAG_ASYNC},
1738 { "ReleaseSession", "", "", release_session },
1739 { "StartDiscovery", "", "", adapter_start_discovery },
1740 { "StopDiscovery", "", "", adapter_stop_discovery,
1741 G_DBUS_METHOD_FLAG_ASYNC},
1742 { "ListDevices", "", "ao", list_devices,
1743 G_DBUS_METHOD_FLAG_DEPRECATED},
1744 { "CreateDevice", "s", "o", create_device,
1745 G_DBUS_METHOD_FLAG_ASYNC},
1746 { "CreatePairedDevice", "sos", "o", create_paired_device,
1747 G_DBUS_METHOD_FLAG_ASYNC},
1748 { "CancelDeviceCreation","s", "", cancel_device_creation,
1749 G_DBUS_METHOD_FLAG_ASYNC},
1750 { "RemoveDevice", "o", "", remove_device,
1751 G_DBUS_METHOD_FLAG_ASYNC},
1752 { "FindDevice", "s", "o", find_device },
1753 { "RegisterAgent", "os", "", register_agent },
1754 { "UnregisterAgent", "o", "", unregister_agent },
1758 static GDBusSignalTable adapter_signals[] = {
1759 { "PropertyChanged", "sv" },
1760 { "DeviceCreated", "o" },
1761 { "DeviceRemoved", "o" },
1762 { "DeviceFound", "sa{sv}" },
1763 { "DeviceDisappeared", "s" },
1767 static void create_stored_device_from_profiles(char *key, char *value,
1770 struct btd_adapter *adapter = user_data;
1771 GSList *list, *uuids = bt_string2list(value);
1772 struct btd_device *device;
1774 if (g_slist_find_custom(adapter->devices,
1775 key, (GCompareFunc) device_address_cmp))
1778 device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
1782 device_set_temporary(device, FALSE);
1783 adapter->devices = g_slist_append(adapter->devices, device);
1785 list = device_services_from_record(device, uuids);
1787 device_register_services(connection, device, list, ATT_PSM);
1789 device_probe_drivers(device, uuids);
1791 g_slist_free_full(uuids, g_free);
1794 struct adapter_keys {
1795 struct btd_adapter *adapter;
1799 static struct link_key_info *get_key_info(const char *addr, const char *value)
1801 struct link_key_info *info;
1806 if (strlen(value) < 36) {
1807 error("Unexpectedly short (%zu) link key line", strlen(value));
1811 info = g_new0(struct link_key_info, 1);
1813 str2ba(addr, &info->bdaddr);
1815 memset(tmp, 0, sizeof(tmp));
1817 for (i = 0; i < 16; i++) {
1818 memcpy(tmp, value + (i * 2), 2);
1819 info->key[i] = (uint8_t) strtol(tmp, NULL, 16);
1822 memcpy(tmp, value + 33, 2);
1823 info->type = (uint8_t) strtol(tmp, NULL, 10);
1825 memcpy(tmp, value + 35, 2);
1826 l = strtol(tmp, NULL, 10);
1834 static void create_stored_device_from_linkkeys(char *key, char *value,
1837 struct adapter_keys *keys = user_data;
1838 struct btd_adapter *adapter = keys->adapter;
1839 struct btd_device *device;
1840 struct link_key_info *info;
1842 info = get_key_info(key, value);
1844 keys->keys = g_slist_append(keys->keys, info);
1846 if (g_slist_find_custom(adapter->devices, key,
1847 (GCompareFunc) device_address_cmp))
1850 device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
1852 device_set_temporary(device, FALSE);
1853 adapter->devices = g_slist_append(adapter->devices, device);
1857 static void create_stored_device_from_blocked(char *key, char *value,
1860 struct btd_adapter *adapter = user_data;
1861 struct btd_device *device;
1863 if (g_slist_find_custom(adapter->devices,
1864 key, (GCompareFunc) device_address_cmp))
1867 device = device_create(connection, adapter, key, ADDR_TYPE_BREDR);
1869 device_set_temporary(device, FALSE);
1870 adapter->devices = g_slist_append(adapter->devices, device);
1874 static GSList *string_to_primary_list(char *str)
1883 services = g_strsplit(str, " ", 0);
1884 if (services == NULL)
1887 for (i = 0; services[i]; i++) {
1888 struct att_primary *prim;
1891 prim = g_new0(struct att_primary, 1);
1893 ret = sscanf(services[i], "%04hX#%04hX#%s", &prim->start,
1894 &prim->end, prim->uuid);
1901 l = g_slist_append(l, prim);
1904 g_strfreev(services);
1909 static void create_stored_device_from_primary(char *key, char *value,
1912 struct btd_adapter *adapter = user_data;
1913 struct btd_device *device;
1914 GSList *services, *uuids, *l;
1916 if (g_slist_find_custom(adapter->devices,
1917 key, (GCompareFunc) device_address_cmp))
1920 /* FIXME: Get the correct LE addr type (public/random) */
1921 device = device_create(connection, adapter, key, ADDR_TYPE_LE_PUBLIC);
1925 device_set_temporary(device, FALSE);
1926 adapter->devices = g_slist_append(adapter->devices, device);
1928 services = string_to_primary_list(value);
1929 if (services == NULL)
1932 for (l = services, uuids = NULL; l; l = l->next) {
1933 struct att_primary *prim = l->data;
1934 uuids = g_slist_append(uuids, prim->uuid);
1937 device_register_services(connection, device, services, -1);
1939 device_probe_drivers(device, uuids);
1941 g_slist_free(uuids);
1944 static void load_devices(struct btd_adapter *adapter)
1946 char filename[PATH_MAX + 1];
1948 struct adapter_keys keys = { adapter, NULL };
1951 ba2str(&adapter->bdaddr, srcaddr);
1953 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "profiles");
1954 textfile_foreach(filename, create_stored_device_from_profiles,
1957 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "primary");
1958 textfile_foreach(filename, create_stored_device_from_primary,
1961 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
1962 textfile_foreach(filename, create_stored_device_from_linkkeys, &keys);
1964 err = adapter_ops->load_keys(adapter->dev_id, keys.keys,
1965 main_opts.debug_keys);
1967 error("Unable to load keys to adapter_ops: %s (%d)",
1968 strerror(-err), -err);
1969 g_slist_free_full(keys.keys, g_free);
1972 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "blocked");
1973 textfile_foreach(filename, create_stored_device_from_blocked, adapter);
1976 int btd_adapter_block_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
1978 return adapter_ops->block_device(adapter->dev_id, bdaddr);
1981 int btd_adapter_unblock_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
1983 return adapter_ops->unblock_device(adapter->dev_id, bdaddr);
1986 static void clear_blocked(struct btd_adapter *adapter)
1990 err = adapter_ops->unblock_device(adapter->dev_id, BDADDR_ANY);
1992 error("Clearing blocked list failed: %s (%d)",
1993 strerror(-err), -err);
1996 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
1998 struct btd_adapter_driver *driver = user_data;
2004 if (driver->probe == NULL)
2007 err = driver->probe(adapter);
2009 error("%s: %s (%d)", driver->name, strerror(-err), -err);
2013 adapter->loaded_drivers = g_slist_prepend(adapter->loaded_drivers,
2017 static void load_drivers(struct btd_adapter *adapter)
2021 for (l = adapter_drivers; l; l = l->next)
2022 probe_driver(adapter, l->data);
2025 static void load_connections(struct btd_adapter *adapter)
2030 err = adapter_ops->get_conn_list(adapter->dev_id, &conns);
2032 error("Unable to fetch existing connections: %s (%d)",
2033 strerror(-err), -err);
2037 for (l = conns; l != NULL; l = g_slist_next(l)) {
2038 bdaddr_t *bdaddr = l->data;
2039 struct btd_device *device;
2042 ba2str(bdaddr, address);
2043 DBG("Adding existing connection to %s", address);
2045 device = adapter_get_device(connection, adapter, address);
2047 adapter_add_connection(adapter, device);
2050 g_slist_free_full(conns, g_free);
2053 static int get_discoverable_timeout(const char *src)
2057 if (read_discoverable_timeout(src, &timeout) == 0)
2060 return main_opts.discovto;
2063 static int get_pairable_timeout(const char *src)
2067 if (read_pairable_timeout(src, &timeout) == 0)
2070 return main_opts.pairto;
2073 static void call_adapter_powered_callbacks(struct btd_adapter *adapter,
2078 for (l = adapter->powered_callbacks; l; l = l->next) {
2079 btd_adapter_powered_cb cb = l->data;
2081 cb(adapter, powered);
2085 static void emit_device_disappeared(gpointer data, gpointer user_data)
2087 struct remote_dev_info *dev = data;
2088 struct btd_adapter *adapter = user_data;
2090 const char *paddr = address;
2092 ba2str(&dev->bdaddr, address);
2094 g_dbus_emit_signal(connection, adapter->path,
2095 ADAPTER_INTERFACE, "DeviceDisappeared",
2096 DBUS_TYPE_STRING, &paddr,
2099 adapter->found_devices = g_slist_remove(adapter->found_devices, dev);
2102 void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
2103 uint8_t *on_mode, gboolean *pairable)
2105 char str[14], address[18];
2107 ba2str(&adapter->bdaddr, address);
2110 if (main_opts.remember_powered == FALSE)
2111 *mode = main_opts.mode;
2112 else if (read_device_mode(address, str, sizeof(str)) == 0)
2113 *mode = get_mode(&adapter->bdaddr, str);
2115 *mode = main_opts.mode;
2119 *on_mode = get_mode(&adapter->bdaddr, "on");
2122 *pairable = adapter->pairable;
2125 void btd_adapter_start(struct btd_adapter *adapter)
2131 ba2str(&adapter->bdaddr, address);
2133 adapter->dev_class = 0;
2134 adapter->off_requested = FALSE;
2136 adapter->discov_timeout = get_discoverable_timeout(address);
2137 adapter->pairable_timeout = get_pairable_timeout(address);
2138 adapter->mode = MODE_CONNECTABLE;
2139 adapter->off_timer = 0;
2141 /* Forcing: Name is lost when adapter is powered off */
2143 adapter_ops->set_name(adapter->dev_id, adapter->name);
2145 if (read_local_class(&adapter->bdaddr, cls) < 0) {
2146 uint32_t class = htobl(main_opts.class);
2147 memcpy(cls, &class, 3);
2150 btd_adapter_set_class(adapter, cls[1], cls[0]);
2153 emit_property_changed(connection, adapter->path,
2154 ADAPTER_INTERFACE, "Powered",
2155 DBUS_TYPE_BOOLEAN, &powered);
2157 call_adapter_powered_callbacks(adapter, TRUE);
2159 adapter_ops->disable_cod_cache(adapter->dev_id);
2161 info("Adapter %s has been enabled", adapter->path);
2164 static void reply_pending_requests(struct btd_adapter *adapter)
2171 /* pending bonding */
2172 for (l = adapter->devices; l; l = l->next) {
2173 struct btd_device *device = l->data;
2175 if (device_is_bonding(device, NULL))
2176 device_cancel_bonding(device,
2177 HCI_OE_USER_ENDED_CONNECTION);
2181 static void remove_driver(gpointer data, gpointer user_data)
2183 struct btd_adapter_driver *driver = data;
2184 struct btd_adapter *adapter = user_data;
2187 driver->remove(adapter);
2190 static void unload_drivers(struct btd_adapter *adapter)
2192 g_slist_foreach(adapter->loaded_drivers, remove_driver, adapter);
2193 g_slist_free(adapter->loaded_drivers);
2194 adapter->loaded_drivers = NULL;
2197 static void set_mode_complete(struct btd_adapter *adapter)
2199 struct session_req *pending;
2200 const char *modestr;
2205 if (adapter->mode == MODE_OFF) {
2206 g_slist_free_full(adapter->mode_sessions, session_free);
2207 adapter->mode_sessions = NULL;
2210 if (adapter->pending_mode == NULL)
2213 pending = adapter->pending_mode;
2214 adapter->pending_mode = NULL;
2216 err = (pending->mode != adapter->mode) ? -EINVAL : 0;
2218 if (pending->msg != NULL) {
2219 DBusMessage *msg = pending->msg;
2223 reply = btd_error_failed(msg, strerror(-err));
2225 if (strcmp(dbus_message_get_member(msg),
2226 "SetProperty") == 0)
2227 adapter->global_mode = adapter->mode;
2228 reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
2231 g_dbus_send_message(connection, reply);
2234 modestr = mode2str(adapter->mode);
2238 /* restore if the mode doesn't matches the pending */
2240 write_device_mode(&adapter->bdaddr, modestr);
2241 error("unable to set mode: %s", mode2str(pending->mode));
2244 session_unref(pending);
2247 int btd_adapter_stop(struct btd_adapter *adapter)
2249 gboolean prop_false = FALSE;
2251 /* cancel pending timeout */
2252 if (adapter->discov_timeout_id) {
2253 g_source_remove(adapter->discov_timeout_id);
2254 adapter->discov_timeout_id = 0;
2257 /* check pending requests */
2258 reply_pending_requests(adapter);
2260 stop_discovery(adapter);
2262 if (adapter->disc_sessions) {
2263 g_slist_free_full(adapter->disc_sessions, session_free);
2264 adapter->disc_sessions = NULL;
2267 while (adapter->connections) {
2268 struct btd_device *device = adapter->connections->data;
2269 adapter_remove_connection(adapter, device);
2272 if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY))
2273 emit_property_changed(connection, adapter->path,
2274 ADAPTER_INTERFACE, "Discoverable",
2275 DBUS_TYPE_BOOLEAN, &prop_false);
2277 if ((adapter->scan_mode & SCAN_PAGE) && adapter->pairable == TRUE)
2278 emit_property_changed(connection, adapter->path,
2279 ADAPTER_INTERFACE, "Pairable",
2280 DBUS_TYPE_BOOLEAN, &prop_false);
2282 if (adapter->discovering)
2283 emit_property_changed(connection, adapter->path,
2284 ADAPTER_INTERFACE, "Discovering",
2285 DBUS_TYPE_BOOLEAN, &prop_false);
2287 emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2288 "Powered", DBUS_TYPE_BOOLEAN, &prop_false);
2290 adapter->up = FALSE;
2291 adapter->scan_mode = SCAN_DISABLED;
2292 adapter->mode = MODE_OFF;
2293 adapter->off_requested = FALSE;
2295 call_adapter_powered_callbacks(adapter, FALSE);
2297 info("Adapter %s has been disabled", adapter->path);
2299 set_mode_complete(adapter);
2304 static void off_timer_remove(struct btd_adapter *adapter)
2306 g_source_remove(adapter->off_timer);
2307 adapter->off_timer = 0;
2310 static void adapter_free(gpointer user_data)
2312 struct btd_adapter *adapter = user_data;
2314 agent_free(adapter->agent);
2315 adapter->agent = NULL;
2319 if (adapter->auth_idle_id)
2320 g_source_remove(adapter->auth_idle_id);
2322 if (adapter->off_timer)
2323 off_timer_remove(adapter);
2325 sdp_list_free(adapter->services, NULL);
2327 g_slist_free_full(adapter->found_devices, dev_info_free);
2329 g_slist_free(adapter->oor_devices);
2331 g_free(adapter->path);
2332 g_free(adapter->name);
2336 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
2340 DBG("%p: ref=%d", adapter, adapter->ref);
2345 void btd_adapter_unref(struct btd_adapter *adapter)
2351 DBG("%p: ref=%d", adapter, adapter->ref);
2353 if (adapter->ref > 0)
2356 path = g_strdup(adapter->path);
2358 g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2363 gboolean adapter_init(struct btd_adapter *adapter)
2365 /* adapter_ops makes sure that newly registered adapters always
2366 * start off as powered */
2369 adapter->allow_name_changes = TRUE;
2371 adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
2373 if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
2374 error("No address available for hci%d", adapter->dev_id);
2378 sdp_init_services_list(&adapter->bdaddr);
2380 if (main_opts.attrib_server)
2381 btd_adapter_gatt_server_start(adapter);
2383 load_drivers(adapter);
2384 clear_blocked(adapter);
2385 load_devices(adapter);
2387 /* Set pairable mode */
2388 if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
2389 adapter->pairable = TRUE;
2391 /* retrieve the active connections: address the scenario where
2392 * the are active connections before the daemon've started */
2393 load_connections(adapter);
2395 adapter->initialized = TRUE;
2400 struct btd_adapter *adapter_create(DBusConnection *conn, int id)
2402 char path[MAX_PATH_LENGTH];
2403 struct btd_adapter *adapter;
2404 const char *base_path = manager_get_base_path();
2409 adapter = g_try_new0(struct btd_adapter, 1);
2411 error("adapter_create: failed to alloc memory for hci%d", id);
2415 adapter->dev_id = id;
2417 snprintf(path, sizeof(path), "%s/hci%d", base_path, id);
2418 adapter->path = g_strdup(path);
2420 if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2421 adapter_methods, adapter_signals, NULL,
2422 adapter, adapter_free)) {
2423 error("Adapter interface init failed on path %s", path);
2424 adapter_free(adapter);
2428 return btd_adapter_ref(adapter);
2431 void adapter_remove(struct btd_adapter *adapter)
2435 DBG("Removing adapter %s", adapter->path);
2437 for (l = adapter->devices; l; l = l->next)
2438 device_remove(l->data, FALSE);
2439 g_slist_free(adapter->devices);
2441 unload_drivers(adapter);
2442 if (main_opts.attrib_server)
2443 btd_adapter_gatt_server_stop(adapter);
2445 g_slist_free(adapter->pin_callbacks);
2447 /* Return adapter to down state if it was not up on init */
2448 adapter_ops->restore_powered(adapter->dev_id);
2451 uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2453 return adapter->dev_id;
2456 const gchar *adapter_get_path(struct btd_adapter *adapter)
2461 return adapter->path;
2464 void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2466 bacpy(bdaddr, &adapter->bdaddr);
2469 void adapter_set_allow_name_changes(struct btd_adapter *adapter,
2470 gboolean allow_name_changes)
2472 adapter->allow_name_changes = allow_name_changes;
2475 void adapter_set_discovering(struct btd_adapter *adapter,
2476 gboolean discovering)
2478 const char *path = adapter->path;
2480 adapter->discovering = discovering;
2482 emit_property_changed(connection, path,
2483 ADAPTER_INTERFACE, "Discovering",
2484 DBUS_TYPE_BOOLEAN, &discovering);
2489 g_slist_foreach(adapter->oor_devices, emit_device_disappeared, adapter);
2490 g_slist_free_full(adapter->oor_devices, dev_info_free);
2491 adapter->oor_devices = g_slist_copy(adapter->found_devices);
2493 if (!adapter_has_discov_sessions(adapter) || adapter->discov_suspended)
2496 DBG("hci%u enabling timer, disc_sessions %u", adapter->dev_id,
2497 g_slist_length(adapter->disc_sessions));
2499 adapter->discov_id = g_timeout_add_seconds(main_opts.discov_interval,
2500 discovery_cb, adapter);
2503 static void suspend_discovery(struct btd_adapter *adapter)
2505 if (adapter->disc_sessions == NULL || adapter->discov_suspended)
2508 DBG("Suspending discovery");
2510 if (adapter->oor_devices) {
2511 g_slist_free(adapter->oor_devices);
2512 adapter->oor_devices = NULL;
2515 adapter->discov_suspended = TRUE;
2517 if (adapter->discov_id > 0) {
2518 g_source_remove(adapter->discov_id);
2519 adapter->discov_id = 0;
2521 adapter_ops->stop_discovery(adapter->dev_id);
2524 static int found_device_cmp(gconstpointer a, gconstpointer b)
2526 const struct remote_dev_info *d = a;
2527 const bdaddr_t *bdaddr = b;
2529 if (bacmp(bdaddr, BDADDR_ANY) == 0)
2532 return bacmp(&d->bdaddr, bdaddr);
2535 struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
2540 l = g_slist_find_custom(adapter->found_devices, bdaddr,
2548 static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
2552 rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
2553 rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
2555 return rssi1 - rssi2;
2558 static void append_dict_valist(DBusMessageIter *iter,
2559 const char *first_key,
2562 DBusMessageIter dict;
2568 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
2569 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2570 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
2571 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
2575 type = va_arg(var_args, int);
2576 val = va_arg(var_args, void *);
2577 if (type == DBUS_TYPE_ARRAY) {
2578 n_elements = va_arg(var_args, int);
2580 dict_append_array(&dict, key, DBUS_TYPE_STRING,
2583 dict_append_entry(&dict, key, type, val);
2584 key = va_arg(var_args, char *);
2587 dbus_message_iter_close_container(iter, &dict);
2590 static void emit_device_found(const char *path, const char *address,
2591 const char *first_key, ...)
2593 DBusMessage *signal;
2594 DBusMessageIter iter;
2597 signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
2600 error("Unable to allocate new %s.DeviceFound signal",
2604 dbus_message_iter_init_append(signal, &iter);
2605 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
2607 va_start(var_args, first_key);
2608 append_dict_valist(&iter, first_key, var_args);
2611 g_dbus_send_message(connection, signal);
2614 static char **strlist2array(GSList *list)
2622 n = g_slist_length(list);
2623 array = g_new0(char *, n + 1);
2625 for (i = 0; list; list = list->next, i++)
2626 array[i] = g_strdup((const gchar *) list->data);
2631 void adapter_emit_device_found(struct btd_adapter *adapter,
2632 struct remote_dev_info *dev)
2634 struct btd_device *device;
2635 char peer_addr[18], local_addr[18];
2636 const char *icon, *paddr = peer_addr;
2637 dbus_bool_t paired = FALSE, trusted = FALSE;
2638 dbus_int16_t rssi = dev->rssi;
2642 ba2str(&dev->bdaddr, peer_addr);
2643 ba2str(&adapter->bdaddr, local_addr);
2645 device = adapter_find_device(adapter, paddr);
2647 paired = device_is_paired(device);
2648 trusted = device_is_trusted(device);
2651 /* The uuids string array is updated only if necessary */
2652 uuid_count = g_slist_length(dev->services);
2653 if (dev->services && dev->uuid_count != uuid_count) {
2654 g_strfreev(dev->uuids);
2655 dev->uuids = strlist2array(dev->services);
2656 dev->uuid_count = uuid_count;
2661 alias = g_strdup(peer_addr);
2662 g_strdelimit(alias, ":", '-');
2664 alias = g_strdup(dev->name);
2666 alias = g_strdup(dev->alias);
2668 if (dev->type != ADDR_TYPE_BREDR) {
2669 gboolean broadcaster;
2671 if (dev->flags & (EIR_LIM_DISC | EIR_GEN_DISC))
2672 broadcaster = FALSE;
2676 dev->legacy = FALSE;
2678 emit_device_found(adapter->path, paddr,
2679 "Address", DBUS_TYPE_STRING, &paddr,
2680 "RSSI", DBUS_TYPE_INT16, &rssi,
2681 "Name", DBUS_TYPE_STRING, &dev->name,
2682 "Alias", DBUS_TYPE_STRING, &alias,
2683 "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2684 "Paired", DBUS_TYPE_BOOLEAN, &paired,
2685 "Broadcaster", DBUS_TYPE_BOOLEAN, &broadcaster,
2686 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2689 icon = class_to_icon(dev->class);
2691 emit_device_found(adapter->path, paddr,
2692 "Address", DBUS_TYPE_STRING, &paddr,
2693 "Class", DBUS_TYPE_UINT32, &dev->class,
2694 "Icon", DBUS_TYPE_STRING, &icon,
2695 "RSSI", DBUS_TYPE_INT16, &rssi,
2696 "Name", DBUS_TYPE_STRING, &dev->name,
2697 "Alias", DBUS_TYPE_STRING, &alias,
2698 "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2699 "Paired", DBUS_TYPE_BOOLEAN, &paired,
2700 "Trusted", DBUS_TYPE_BOOLEAN, &trusted,
2701 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2708 static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
2709 addr_type_t type, const char *name,
2710 const char *alias, uint32_t class,
2711 gboolean legacy, int flags)
2713 struct remote_dev_info *dev;
2715 dev = g_new0(struct remote_dev_info, 1);
2716 bacpy(&dev->bdaddr, bdaddr);
2718 dev->name = g_strdup(name);
2719 dev->alias = g_strdup(alias);
2721 dev->legacy = legacy;
2728 static void remove_same_uuid(gpointer data, gpointer user_data)
2730 struct remote_dev_info *dev = user_data;
2733 for (l = dev->services; l; l = l->next) {
2734 char *current_uuid = l->data;
2735 char *new_uuid = data;
2737 if (strcmp(current_uuid, new_uuid) == 0) {
2738 g_free(current_uuid);
2739 dev->services = g_slist_delete_link(dev->services, l);
2745 static void dev_prepend_uuid(gpointer data, gpointer user_data)
2747 struct remote_dev_info *dev = user_data;
2748 char *new_uuid = data;
2750 dev->services = g_slist_prepend(dev->services, g_strdup(new_uuid));
2753 static gboolean pairing_is_legacy(bdaddr_t *local, bdaddr_t *peer,
2754 const uint8_t *eir, const char *name)
2756 unsigned char features[8];
2764 if (read_remote_features(local, peer, NULL, features) < 0)
2767 if (features[0] & 0x01)
2773 static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer, const char *file)
2775 char local_addr[18], peer_addr[18], filename[PATH_MAX + 1];
2777 ba2str(local, local_addr);
2778 ba2str(peer, peer_addr);
2780 create_name(filename, PATH_MAX, STORAGEDIR, local_addr, file);
2782 return textfile_get(filename, peer_addr);
2785 void adapter_update_found_devices(struct btd_adapter *adapter,
2786 bdaddr_t *bdaddr, addr_type_t type,
2787 uint32_t class, int8_t rssi,
2788 uint8_t confirm_name,
2789 uint8_t *data, uint8_t data_len)
2791 struct remote_dev_info *dev;
2792 struct eir_data eir_data;
2794 gboolean legacy, name_known;
2797 memset(&eir_data, 0, sizeof(eir_data));
2798 err = eir_parse(&eir_data, data, data_len);
2800 error("Error parsing EIR data: %s (%d)", strerror(-err), -err);
2804 if (eir_data.name != NULL && eir_data.name_complete)
2805 write_device_name(&adapter->bdaddr, bdaddr, eir_data.name);
2807 dev = adapter_search_found_devices(adapter, bdaddr);
2809 adapter->oor_devices = g_slist_remove(adapter->oor_devices,
2811 if (dev->rssi != rssi)
2814 eir_data_free(&eir_data);
2819 /* New device in the discovery session */
2821 name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
2823 if (type == ADDR_TYPE_BREDR) {
2824 legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
2827 if (!name && main_opts.name_resolv &&
2828 adapter_has_discov_sessions(adapter))
2838 adapter_ops->confirm_name(adapter->dev_id, bdaddr, name_known);
2840 alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
2842 dev = found_device_new(bdaddr, type, name, alias, class, legacy,
2847 adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
2852 adapter->found_devices = g_slist_sort(adapter->found_devices,
2853 (GCompareFunc) dev_rssi_cmp);
2855 g_slist_foreach(eir_data.services, remove_same_uuid, dev);
2856 g_slist_foreach(eir_data.services, dev_prepend_uuid, dev);
2858 adapter_emit_device_found(adapter, dev);
2860 eir_data_free(&eir_data);
2863 void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
2865 const gchar *path = adapter_get_path(adapter);
2866 gboolean discoverable, pairable;
2868 DBG("old 0x%02x new 0x%02x", adapter->scan_mode, scan_mode);
2870 if (adapter->scan_mode == scan_mode)
2873 adapter_remove_discov_timeout(adapter);
2875 switch (scan_mode) {
2877 adapter->mode = MODE_OFF;
2878 discoverable = FALSE;
2882 adapter->mode = MODE_CONNECTABLE;
2883 discoverable = FALSE;
2884 pairable = adapter->pairable;
2886 case (SCAN_PAGE | SCAN_INQUIRY):
2887 adapter->mode = MODE_DISCOVERABLE;
2888 discoverable = TRUE;
2889 pairable = adapter->pairable;
2890 if (adapter->discov_timeout != 0)
2891 adapter_set_discov_timeout(adapter,
2892 adapter->discov_timeout);
2895 /* Address the scenario where a low-level application like
2896 * hciconfig changed the scan mode */
2897 if (adapter->discov_timeout != 0)
2898 adapter_set_discov_timeout(adapter,
2899 adapter->discov_timeout);
2901 /* ignore, this event should not be sent */
2903 /* ignore, reserved */
2907 /* If page scanning gets toggled emit the Pairable property */
2908 if ((adapter->scan_mode & SCAN_PAGE) != (scan_mode & SCAN_PAGE))
2909 emit_property_changed(connection, adapter->path,
2910 ADAPTER_INTERFACE, "Pairable",
2911 DBUS_TYPE_BOOLEAN, &pairable);
2914 adapter_set_limited_discoverable(adapter, FALSE);
2916 emit_property_changed(connection, path,
2917 ADAPTER_INTERFACE, "Discoverable",
2918 DBUS_TYPE_BOOLEAN, &discoverable);
2920 adapter->scan_mode = scan_mode;
2922 set_mode_complete(adapter);
2925 struct agent *adapter_get_agent(struct btd_adapter *adapter)
2930 return adapter->agent;
2933 void adapter_add_connection(struct btd_adapter *adapter,
2934 struct btd_device *device)
2936 if (g_slist_find(adapter->connections, device)) {
2937 error("Device is already marked as connected");
2941 device_add_connection(device, connection);
2943 adapter->connections = g_slist_append(adapter->connections, device);
2946 void adapter_remove_connection(struct btd_adapter *adapter,
2947 struct btd_device *device)
2951 if (!g_slist_find(adapter->connections, device)) {
2952 error("No matching connection for device");
2956 device_remove_connection(device, connection);
2958 adapter->connections = g_slist_remove(adapter->connections, device);
2960 if (device_is_authenticating(device))
2961 device_cancel_authentication(device, TRUE);
2963 if (device_is_temporary(device)) {
2964 const char *path = device_get_path(device);
2966 DBG("Removing temporary device %s", path);
2967 adapter_remove_device(connection, adapter, device, TRUE);
2971 gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
2973 if (!adapter || !adapter->disc_sessions)
2979 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
2981 adapter_drivers = g_slist_append(adapter_drivers, driver);
2983 if (driver->probe == NULL)
2986 manager_foreach_adapter(probe_driver, driver);
2991 static void unload_driver(struct btd_adapter *adapter, gpointer data)
2993 adapter->loaded_drivers = g_slist_remove(adapter->loaded_drivers, data);
2996 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
2998 adapter_drivers = g_slist_remove(adapter_drivers, driver);
3000 manager_foreach_adapter(unload_driver, driver);
3003 static void agent_auth_cb(struct agent *agent, DBusError *derr,
3006 struct service_auth *auth = user_data;
3008 device_set_authorizing(auth->device, FALSE);
3010 auth->cb(derr, auth->user_data);
3013 static gboolean auth_idle_cb(gpointer user_data)
3015 struct service_auth *auth = user_data;
3016 struct btd_adapter *adapter = auth->adapter;
3018 adapter->auth_idle_id = 0;
3020 auth->cb(NULL, auth->user_data);
3025 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
3026 const char *uuid, service_auth_cb cb,
3029 struct service_auth *auth;
3030 struct btd_device *device;
3031 struct agent *agent;
3033 const gchar *dev_path;
3036 ba2str(dst, address);
3037 device = adapter_find_device(adapter, address);
3041 /* Device connected? */
3042 if (!g_slist_find(adapter->connections, device))
3045 if (adapter->auth_idle_id)
3048 auth = g_try_new0(struct service_auth, 1);
3053 auth->user_data = user_data;
3054 auth->device = device;
3055 auth->adapter = adapter;
3057 if (device_is_trusted(device) == TRUE) {
3058 adapter->auth_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
3064 agent = device_get_agent(device);
3070 dev_path = device_get_path(device);
3072 err = agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth, g_free);
3076 device_set_authorizing(device, TRUE);
3081 int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3082 const char *uuid, service_auth_cb cb,
3085 struct btd_adapter *adapter;
3088 if (bacmp(src, BDADDR_ANY) != 0) {
3089 adapter = manager_find_adapter(src);
3093 return adapter_authorize(adapter, dst, uuid, cb, user_data);
3096 for (l = manager_get_adapters(); l != NULL; l = g_slist_next(l)) {
3101 err = adapter_authorize(adapter, dst, uuid, cb, user_data);
3109 int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3111 struct btd_adapter *adapter = manager_find_adapter(src);
3112 struct btd_device *device;
3113 struct agent *agent;
3120 ba2str(dst, address);
3121 device = adapter_find_device(adapter, address);
3125 if (adapter->auth_idle_id) {
3126 g_source_remove(adapter->auth_idle_id);
3127 adapter->auth_idle_id = 0;
3132 * FIXME: Cancel fails if authorization is requested to adapter's
3133 * agent and in the meanwhile CreatePairedDevice is called.
3136 agent = device_get_agent(device);
3140 err = agent_cancel(agent);
3143 device_set_authorizing(device, FALSE);
3148 static gchar *adapter_any_path = NULL;
3149 static int adapter_any_refcount = 0;
3151 const char *adapter_any_get_path(void)
3153 return adapter_any_path;
3156 const char *btd_adapter_any_request_path(void)
3158 if (adapter_any_refcount++ > 0)
3159 return adapter_any_path;
3161 adapter_any_path = g_strdup_printf("%s/any", manager_get_base_path());
3163 return adapter_any_path;
3166 void btd_adapter_any_release_path(void)
3168 adapter_any_refcount--;
3170 if (adapter_any_refcount > 0)
3173 g_free(adapter_any_path);
3174 adapter_any_path = NULL;
3177 gboolean adapter_powering_down(struct btd_adapter *adapter)
3179 return adapter->off_requested;
3182 int btd_adapter_restore_powered(struct btd_adapter *adapter)
3184 char mode[14], address[18];
3189 if (!main_opts.remember_powered)
3195 ba2str(&adapter->bdaddr, address);
3196 if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
3197 g_str_equal(mode, "off"))
3200 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3203 static gboolean switch_off_timeout(gpointer user_data)
3205 struct btd_adapter *adapter = user_data;
3207 adapter_ops->set_powered(adapter->dev_id, FALSE);
3208 adapter->off_timer = 0;
3213 int btd_adapter_switch_online(struct btd_adapter *adapter)
3221 if (adapter->off_timer)
3222 off_timer_remove(adapter);
3224 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3227 int btd_adapter_switch_offline(struct btd_adapter *adapter)
3235 if (adapter->off_timer)
3238 adapter->global_mode = MODE_OFF;
3240 if (adapter->connections == NULL)
3241 return adapter_ops->set_powered(adapter->dev_id, FALSE);
3243 g_slist_foreach(adapter->connections,
3244 (GFunc) device_request_disconnect, NULL);
3246 adapter->off_timer = g_timeout_add_seconds(OFF_TIMER,
3247 switch_off_timeout, adapter);
3252 static gboolean disable_auto(gpointer user_data)
3254 struct btd_adapter *adapter = user_data;
3257 for (l = adapter->devices; l; l = l->next) {
3258 struct btd_device *device = l->data;
3260 device_set_auto_connect(device, FALSE);
3263 adapter->auto_timeout_id = 0;
3268 static void set_auto_connect(gpointer data, gpointer user_data)
3270 struct btd_device *device = data;
3272 device_set_auto_connect(device, TRUE);
3275 void btd_adapter_enable_auto_connect(struct btd_adapter *adapter)
3280 DBG("Enabling automatic connections");
3282 if (adapter->auto_timeout_id)
3285 g_slist_foreach(adapter->devices, set_auto_connect, NULL);
3287 adapter->auto_timeout_id = g_timeout_add_seconds(main_opts.autoto,
3288 disable_auto, adapter);
3291 void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
3292 btd_adapter_pin_cb_t cb)
3294 adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
3297 void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
3298 btd_adapter_pin_cb_t cb)
3300 adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
3303 ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
3307 btd_adapter_pin_cb_t cb;
3311 for (l = adapter->pin_callbacks; l != NULL; l = g_slist_next(l)) {
3313 ret = cb(adapter, dev, pin_buf);
3318 adapter_get_address(adapter, &sba);
3319 device_get_address(dev, &dba, NULL);
3321 return read_pin_code(&sba, &dba, pin_buf);
3324 int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
3326 if (ops->setup == NULL)
3330 ops_candidates = g_slist_prepend(ops_candidates, ops);
3332 ops_candidates = g_slist_append(ops_candidates, ops);
3337 void btd_adapter_cleanup_ops(struct btd_adapter_ops *ops)
3339 ops_candidates = g_slist_remove(ops_candidates, ops);
3342 if (adapter_ops == ops)
3346 int adapter_ops_setup(void)
3351 if (!ops_candidates)
3354 for (l = ops_candidates; l != NULL; l = g_slist_next(l)) {
3355 struct btd_adapter_ops *ops = l->data;
3368 void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
3369 btd_adapter_powered_cb cb)
3371 adapter->powered_callbacks =
3372 g_slist_append(adapter->powered_callbacks, cb);
3375 void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
3376 btd_adapter_powered_cb cb)
3378 adapter->powered_callbacks =
3379 g_slist_remove(adapter->powered_callbacks, cb);
3382 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
3391 return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
3394 int btd_adapter_read_clock(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3395 int which, int timeout, uint32_t *clock,
3404 return adapter_ops->read_clock(adapter->dev_id, bdaddr, which,
3405 timeout, clock, accuracy);
3408 int btd_adapter_disconnect_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3410 return adapter_ops->disconnect(adapter->dev_id, bdaddr);
3413 int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3415 return adapter_ops->remove_bonding(adapter->dev_id, bdaddr);
3418 int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3419 const char *pin, size_t pin_len)
3421 return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin,
3425 int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3428 return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, success);
3431 int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3434 return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, passkey);
3437 int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3438 bt_hci_result_t cb, gpointer user_data)
3440 return adapter_ops->encrypt_link(adapter->dev_id, bdaddr, cb, user_data);
3443 int btd_adapter_set_did(struct btd_adapter *adapter, uint16_t vendor,
3444 uint16_t product, uint16_t version)
3446 return adapter_ops->set_did(adapter->dev_id, vendor, product, version);
3449 int adapter_create_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3452 suspend_discovery(adapter);
3453 return adapter_ops->create_bonding(adapter->dev_id, bdaddr, io_cap);
3456 int adapter_cancel_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3458 return adapter_ops->cancel_bonding(adapter->dev_id, bdaddr);
3461 void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3464 struct btd_device *device;
3467 ba2str(bdaddr, addr);
3469 device = adapter_get_device(connection, adapter, addr);
3471 device = adapter_find_device(adapter, addr);
3474 device_bonding_complete(device, status);
3476 if (adapter->discov_suspended) {
3477 adapter->discov_suspended = FALSE;
3478 adapter_ops->start_discovery(adapter->dev_id);
3482 int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
3484 return adapter_ops->read_local_oob_data(adapter->dev_id);
3487 int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
3488 bdaddr_t *bdaddr, uint8_t *hash, uint8_t *randomizer)
3490 return adapter_ops->add_remote_oob_data(adapter->dev_id, bdaddr, hash,
3494 int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
3497 return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);