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;
2272
if (adapter->mode == MODE_OFF) {
2273
g_slist_free_full(adapter->mode_sessions, session_free);
2274
adapter->mode_sessions = NULL;
2277
if (adapter->pending_mode == NULL)
2280
pending = adapter->pending_mode;
2281
adapter->pending_mode = NULL;
2283
err = (pending->mode != adapter->mode) ? -EINVAL : 0;
2285
if (pending->msg != NULL) {
2286
DBusMessage *msg = pending->msg;
2290
reply = btd_error_failed(msg, strerror(-err));
2292
if (strcmp(dbus_message_get_member(msg),
2293
"SetProperty") == 0)
2294
adapter->global_mode = adapter->mode;
2295
reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
2298
g_dbus_send_message(connection, reply);
2301
modestr = mode2str(adapter->mode);
2305
/* restore if the mode doesn't matches the pending */
2307
write_device_mode(&adapter->bdaddr, modestr);
2308
error("unable to set mode: %s", mode2str(pending->mode));
2311
session_unref(pending);
2314
int btd_adapter_stop(struct btd_adapter *adapter)
2316
gboolean prop_false = FALSE;
2318
/* check pending requests */
2319
reply_pending_requests(adapter);
2321
adapter->up = FALSE;
2323
stop_discovery(adapter);
2325
if (adapter->disc_sessions) {
2326
g_slist_free_full(adapter->disc_sessions, session_free);
2327
adapter->disc_sessions = NULL;
2330
while (adapter->connections) {
2331
struct btd_device *device = adapter->connections->data;
2332
adapter_remove_connection(adapter, device);
2335
if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY))
2336
emit_property_changed(connection, adapter->path,
2337
ADAPTER_INTERFACE, "Discoverable",
2338
DBUS_TYPE_BOOLEAN, &prop_false);
2340
if ((adapter->scan_mode & SCAN_PAGE) && adapter->pairable == TRUE)
2341
emit_property_changed(connection, adapter->path,
2342
ADAPTER_INTERFACE, "Pairable",
2343
DBUS_TYPE_BOOLEAN, &prop_false);
2345
if (adapter->discovering)
2346
emit_property_changed(connection, adapter->path,
2347
ADAPTER_INTERFACE, "Discovering",
2348
DBUS_TYPE_BOOLEAN, &prop_false);
2350
emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2351
"Powered", DBUS_TYPE_BOOLEAN, &prop_false);
2353
adapter->discovering = FALSE;
2354
adapter->scan_mode = SCAN_DISABLED;
2355
adapter->mode = MODE_OFF;
2356
adapter->off_requested = FALSE;
2358
call_adapter_powered_callbacks(adapter, FALSE);
2360
info("Adapter %s has been disabled", adapter->path);
2362
set_mode_complete(adapter);
2367
static void off_timer_remove(struct btd_adapter *adapter)
2369
g_source_remove(adapter->off_timer);
2370
adapter->off_timer = 0;
2373
static void adapter_free(gpointer user_data)
2375
struct btd_adapter *adapter = user_data;
2377
agent_free(adapter->agent);
2378
adapter->agent = NULL;
2382
if (adapter->auth_idle_id)
2383
g_source_remove(adapter->auth_idle_id);
2385
if (adapter->off_timer)
2386
off_timer_remove(adapter);
2388
sdp_list_free(adapter->services, NULL);
2390
g_slist_free_full(adapter->found_devices, dev_info_free);
2392
g_slist_free(adapter->oor_devices);
2394
g_free(adapter->path);
2395
g_free(adapter->name);
2399
struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
2403
DBG("%p: ref=%d", adapter, adapter->ref);
2408
void btd_adapter_unref(struct btd_adapter *adapter)
2414
DBG("%p: ref=%d", adapter, adapter->ref);
2416
if (adapter->ref > 0)
2419
path = g_strdup(adapter->path);
2421
g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2426
gboolean adapter_init(struct btd_adapter *adapter, gboolean up)
2430
adapter->allow_name_changes = TRUE;
2432
adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
2434
if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
2435
error("No address available for hci%d", adapter->dev_id);
2439
sdp_init_services_list(&adapter->bdaddr);
2441
if (main_opts.gatt_enabled)
2442
btd_adapter_gatt_server_start(adapter);
2444
load_drivers(adapter);
2445
clear_blocked(adapter);
2446
load_devices(adapter);
2448
/* Set pairable mode */
2449
if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
2450
adapter->pairable = TRUE;
2452
/* retrieve the active connections: address the scenario where
2453
* the are active connections before the daemon've started */
2454
load_connections(adapter);
2456
adapter->initialized = TRUE;
2461
struct btd_adapter *adapter_create(DBusConnection *conn, int id)
2463
char path[MAX_PATH_LENGTH];
2464
struct btd_adapter *adapter;
2465
const char *base_path = manager_get_base_path();
2470
adapter = g_try_new0(struct btd_adapter, 1);
2472
error("adapter_create: failed to alloc memory for hci%d", id);
2476
adapter->dev_id = id;
2478
snprintf(path, sizeof(path), "%s/hci%d", base_path, id);
2479
adapter->path = g_strdup(path);
2481
if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2482
adapter_methods, adapter_signals, NULL,
2483
adapter, adapter_free)) {
2484
error("Adapter interface init failed on path %s", path);
2485
adapter_free(adapter);
2489
return btd_adapter_ref(adapter);
2492
void adapter_remove(struct btd_adapter *adapter)
2496
DBG("Removing adapter %s", adapter->path);
2498
for (l = adapter->devices; l; l = l->next)
2499
device_remove(l->data, FALSE);
2500
g_slist_free(adapter->devices);
2502
unload_drivers(adapter);
2503
if (main_opts.gatt_enabled)
2504
btd_adapter_gatt_server_stop(adapter);
2506
g_slist_free(adapter->pin_callbacks);
2508
/* Return adapter to down state if it was not up on init */
2509
adapter_ops->restore_powered(adapter->dev_id);
2512
uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2514
return adapter->dev_id;
2517
const gchar *adapter_get_path(struct btd_adapter *adapter)
2522
return adapter->path;
2525
void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2527
bacpy(bdaddr, &adapter->bdaddr);
2530
void adapter_set_allow_name_changes(struct btd_adapter *adapter,
2531
gboolean allow_name_changes)
2533
adapter->allow_name_changes = allow_name_changes;
2536
void adapter_set_discovering(struct btd_adapter *adapter,
2537
gboolean discovering)
2539
const char *path = adapter->path;
2541
adapter->discovering = discovering;
2543
emit_property_changed(connection, path,
2544
ADAPTER_INTERFACE, "Discovering",
2545
DBUS_TYPE_BOOLEAN, &discovering);
2550
g_slist_foreach(adapter->oor_devices, emit_device_disappeared, adapter);
2551
g_slist_free_full(adapter->oor_devices, dev_info_free);
2552
adapter->oor_devices = g_slist_copy(adapter->found_devices);
2554
if (!adapter_has_discov_sessions(adapter) || adapter->discov_suspended)
2557
DBG("hci%u restarting discovery, disc_sessions %u", adapter->dev_id,
2558
g_slist_length(adapter->disc_sessions));
2560
adapter->discov_id = g_idle_add(discovery_cb, adapter);
2563
static void suspend_discovery(struct btd_adapter *adapter)
2565
if (adapter->disc_sessions == NULL || adapter->discov_suspended)
2568
DBG("Suspending discovery");
2570
if (adapter->oor_devices) {
2571
g_slist_free(adapter->oor_devices);
2572
adapter->oor_devices = NULL;
2575
adapter->discov_suspended = TRUE;
2577
if (adapter->discov_id > 0) {
2578
g_source_remove(adapter->discov_id);
2579
adapter->discov_id = 0;
2581
adapter_ops->stop_discovery(adapter->dev_id);
2584
static int found_device_cmp(gconstpointer a, gconstpointer b)
2586
const struct remote_dev_info *d = a;
2587
const bdaddr_t *bdaddr = b;
2589
if (bacmp(bdaddr, BDADDR_ANY) == 0)
2592
return bacmp(&d->bdaddr, bdaddr);
2595
struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
2600
l = g_slist_find_custom(adapter->found_devices, bdaddr,
2608
static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
2612
rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
2613
rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
2615
return rssi1 - rssi2;
2618
static void append_dict_valist(DBusMessageIter *iter,
2619
const char *first_key,
2622
DBusMessageIter dict;
2628
dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
2629
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
2630
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
2631
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
2635
type = va_arg(var_args, int);
2636
val = va_arg(var_args, void *);
2637
if (type == DBUS_TYPE_ARRAY) {
2638
n_elements = va_arg(var_args, int);
2640
dict_append_array(&dict, key, DBUS_TYPE_STRING,
2643
dict_append_entry(&dict, key, type, val);
2644
key = va_arg(var_args, char *);
2647
dbus_message_iter_close_container(iter, &dict);
2650
static void emit_device_found(const char *path, const char *address,
2651
const char *first_key, ...)
2653
DBusMessage *signal;
2654
DBusMessageIter iter;
2657
signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
2660
error("Unable to allocate new %s.DeviceFound signal",
2664
dbus_message_iter_init_append(signal, &iter);
2665
dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
2667
va_start(var_args, first_key);
2668
append_dict_valist(&iter, first_key, var_args);
2671
g_dbus_send_message(connection, signal);
2674
static char **strlist2array(GSList *list)
2682
n = g_slist_length(list);
2683
array = g_new0(char *, n + 1);
2685
for (i = 0; list; list = list->next, i++)
2686
array[i] = g_strdup((const gchar *) list->data);
2691
void adapter_emit_device_found(struct btd_adapter *adapter,
2692
struct remote_dev_info *dev)
2694
struct btd_device *device;
2695
char peer_addr[18], local_addr[18];
2696
const char *icon, *paddr = peer_addr;
2697
dbus_bool_t paired = FALSE, trusted = FALSE;
2698
dbus_int16_t rssi = dev->rssi;
2702
ba2str(&dev->bdaddr, peer_addr);
2703
ba2str(&adapter->bdaddr, local_addr);
2705
device = adapter_find_device(adapter, paddr);
2707
paired = device_is_paired(device);
2708
trusted = device_is_trusted(device);
2711
/* The uuids string array is updated only if necessary */
2712
uuid_count = g_slist_length(dev->services);
2713
if (dev->services && dev->uuid_count != uuid_count) {
2714
g_strfreev(dev->uuids);
2715
dev->uuids = strlist2array(dev->services);
2716
dev->uuid_count = uuid_count;
2721
alias = g_strdup(peer_addr);
2722
g_strdelimit(alias, ":", '-');
2724
alias = g_strdup(dev->name);
2726
alias = g_strdup(dev->alias);
2728
if (dev->bdaddr_type != BDADDR_BREDR) {
2729
gboolean broadcaster;
2732
if (dev->flags & (EIR_LIM_DISC | EIR_GEN_DISC))
2733
broadcaster = FALSE;
2737
dev->legacy = FALSE;
2739
if (read_remote_appearance(&adapter->bdaddr, &dev->bdaddr,
2740
dev->bdaddr_type, &app) == 0)
2741
icon = gap_appearance_to_icon(app);
2745
emit_device_found(adapter->path, paddr,
2746
"Address", DBUS_TYPE_STRING, &paddr,
2747
"Class", DBUS_TYPE_UINT32, &dev->class,
2748
"Icon", DBUS_TYPE_STRING, &icon,
2749
"RSSI", DBUS_TYPE_INT16, &rssi,
2750
"Name", DBUS_TYPE_STRING, &dev->name,
2751
"Alias", DBUS_TYPE_STRING, &alias,
2752
"LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2753
"Paired", DBUS_TYPE_BOOLEAN, &paired,
2754
"Broadcaster", DBUS_TYPE_BOOLEAN, &broadcaster,
2755
"UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2758
icon = class_to_icon(dev->class);
2760
emit_device_found(adapter->path, paddr,
2761
"Address", DBUS_TYPE_STRING, &paddr,
2762
"Class", DBUS_TYPE_UINT32, &dev->class,
2763
"Icon", DBUS_TYPE_STRING, &icon,
2764
"RSSI", DBUS_TYPE_INT16, &rssi,
2765
"Name", DBUS_TYPE_STRING, &dev->name,
2766
"Alias", DBUS_TYPE_STRING, &alias,
2767
"LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
2768
"Paired", DBUS_TYPE_BOOLEAN, &paired,
2769
"Trusted", DBUS_TYPE_BOOLEAN, &trusted,
2770
"UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
2777
static struct remote_dev_info *found_device_new(const bdaddr_t *bdaddr,
2778
uint8_t bdaddr_type, const char *name,
2779
const char *alias, uint32_t class,
2780
gboolean legacy, int flags)
2782
struct remote_dev_info *dev;
2784
dev = g_new0(struct remote_dev_info, 1);
2785
bacpy(&dev->bdaddr, bdaddr);
2786
dev->bdaddr_type = bdaddr_type;
2787
dev->name = g_strdup(name);
2788
dev->alias = g_strdup(alias);
2790
dev->legacy = legacy;
2797
static void remove_same_uuid(gpointer data, gpointer user_data)
2799
struct remote_dev_info *dev = user_data;
2802
for (l = dev->services; l; l = l->next) {
2803
char *current_uuid = l->data;
2804
char *new_uuid = data;
2806
if (strcmp(current_uuid, new_uuid) == 0) {
2807
g_free(current_uuid);
2808
dev->services = g_slist_delete_link(dev->services, l);
2814
static void dev_prepend_uuid(gpointer data, gpointer user_data)
2816
struct remote_dev_info *dev = user_data;
2817
char *new_uuid = data;
2819
dev->services = g_slist_prepend(dev->services, g_strdup(new_uuid));
2822
static gboolean pairing_is_legacy(bdaddr_t *local, bdaddr_t *peer,
2823
const uint8_t *eir, const char *name)
2825
unsigned char features[8];
2833
if (read_remote_features(local, peer, NULL, features) < 0)
2836
if (features[0] & 0x01)
2842
static char *read_stored_data(bdaddr_t *local, bdaddr_t *peer, const char *file)
2844
char local_addr[18], peer_addr[18], filename[PATH_MAX + 1];
2846
ba2str(local, local_addr);
2847
ba2str(peer, peer_addr);
2849
create_name(filename, PATH_MAX, STORAGEDIR, local_addr, file);
2851
return textfile_get(filename, peer_addr);
2854
void adapter_update_found_devices(struct btd_adapter *adapter,
2855
bdaddr_t *bdaddr, uint8_t bdaddr_type,
2856
int8_t rssi, uint8_t confirm_name,
2857
uint8_t *data, uint8_t data_len)
2859
struct remote_dev_info *dev;
2860
struct eir_data eir_data;
2862
gboolean legacy, name_known;
2866
memset(&eir_data, 0, sizeof(eir_data));
2867
err = eir_parse(&eir_data, data, data_len);
2869
error("Error parsing EIR data: %s (%d)", strerror(-err), -err);
2873
dev_class = eir_data.dev_class[0] | (eir_data.dev_class[1] << 8) |
2874
(eir_data.dev_class[2] << 16);
2876
write_remote_class(&adapter->bdaddr, bdaddr, dev_class);
2878
if (eir_data.appearance != 0)
2879
write_remote_appearance(&adapter->bdaddr, bdaddr, bdaddr_type,
2880
eir_data.appearance);
2882
if (eir_data.name != NULL && eir_data.name_complete)
2883
write_device_name(&adapter->bdaddr, bdaddr, eir_data.name);
2885
dev = adapter_search_found_devices(adapter, bdaddr);
2887
adapter->oor_devices = g_slist_remove(adapter->oor_devices,
2890
/* If an existing device had no name but the newly received EIR
2891
* data has (complete or not), we want to present it to the
2893
if (dev->name == NULL && eir_data.name != NULL) {
2894
dev->name = g_strdup(eir_data.name);
2898
if (dev->rssi != rssi)
2901
eir_data_free(&eir_data);
2906
/* New device in the discovery session */
2908
name = read_stored_data(&adapter->bdaddr, bdaddr, "names");
2910
if (bdaddr_type == BDADDR_BREDR) {
2911
legacy = pairing_is_legacy(&adapter->bdaddr, bdaddr, data,
2914
if (!name && main_opts.name_resolv &&
2915
adapter_has_discov_sessions(adapter))
2925
adapter_ops->confirm_name(adapter->dev_id, bdaddr, bdaddr_type,
2928
alias = read_stored_data(&adapter->bdaddr, bdaddr, "aliases");
2930
dev = found_device_new(bdaddr, bdaddr_type, name, alias, dev_class,
2931
legacy, eir_data.flags);
2935
adapter->found_devices = g_slist_prepend(adapter->found_devices, dev);
2940
adapter->found_devices = g_slist_sort(adapter->found_devices,
2941
(GCompareFunc) dev_rssi_cmp);
2943
g_slist_foreach(eir_data.services, remove_same_uuid, dev);
2944
g_slist_foreach(eir_data.services, dev_prepend_uuid, dev);
2946
adapter_emit_device_found(adapter, dev);
2948
eir_data_free(&eir_data);
2951
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
2953
const gchar *path = adapter_get_path(adapter);
2954
gboolean discoverable, pairable;
2956
DBG("old 0x%02x new 0x%02x", adapter->scan_mode, scan_mode);
2958
if (adapter->scan_mode == scan_mode)
2961
switch (scan_mode) {
2963
adapter->mode = MODE_OFF;
2964
discoverable = FALSE;
2968
adapter->mode = MODE_CONNECTABLE;
2969
discoverable = FALSE;
2970
pairable = adapter->pairable;
2972
case (SCAN_PAGE | SCAN_INQUIRY):
2973
adapter->mode = MODE_DISCOVERABLE;
2974
discoverable = TRUE;
2975
pairable = adapter->pairable;
2978
/* ignore, reserved */
2982
/* If page scanning gets toggled emit the Pairable property */
2983
if ((adapter->scan_mode & SCAN_PAGE) != (scan_mode & SCAN_PAGE))
2984
emit_property_changed(connection, adapter->path,
2985
ADAPTER_INTERFACE, "Pairable",
2986
DBUS_TYPE_BOOLEAN, &pairable);
2988
emit_property_changed(connection, path,
2989
ADAPTER_INTERFACE, "Discoverable",
2990
DBUS_TYPE_BOOLEAN, &discoverable);
2992
adapter->scan_mode = scan_mode;
2994
set_mode_complete(adapter);
2997
struct agent *adapter_get_agent(struct btd_adapter *adapter)
3002
return adapter->agent;
3005
void adapter_add_connection(struct btd_adapter *adapter,
3006
struct btd_device *device)
3008
if (g_slist_find(adapter->connections, device)) {
3009
error("Device is already marked as connected");
3013
device_add_connection(device, connection);
3015
adapter->connections = g_slist_append(adapter->connections, device);
3018
void adapter_remove_connection(struct btd_adapter *adapter,
3019
struct btd_device *device)
3023
if (!g_slist_find(adapter->connections, device)) {
3024
error("No matching connection for device");
3028
device_remove_connection(device, connection);
3030
adapter->connections = g_slist_remove(adapter->connections, device);
3032
if (device_is_authenticating(device))
3033
device_cancel_authentication(device, TRUE);
3035
if (device_is_temporary(device)) {
3036
const char *path = device_get_path(device);
3038
DBG("Removing temporary device %s", path);
3039
adapter_remove_device(connection, adapter, device, TRUE);
3043
gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
3045
if (!adapter || !adapter->disc_sessions)
3051
int btd_register_adapter_driver(struct btd_adapter_driver *driver)
3053
adapter_drivers = g_slist_append(adapter_drivers, driver);
3055
if (driver->probe == NULL)
3058
manager_foreach_adapter(probe_driver, driver);
3063
static void unload_driver(struct btd_adapter *adapter, gpointer data)
3065
adapter->loaded_drivers = g_slist_remove(adapter->loaded_drivers, data);
3068
void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
3070
adapter_drivers = g_slist_remove(adapter_drivers, driver);
3072
manager_foreach_adapter(unload_driver, driver);
3075
static void agent_auth_cb(struct agent *agent, DBusError *derr,
3078
struct service_auth *auth = user_data;
3080
device_set_authorizing(auth->device, FALSE);
3082
auth->cb(derr, auth->user_data);
3085
static gboolean auth_idle_cb(gpointer user_data)
3087
struct service_auth *auth = user_data;
3088
struct btd_adapter *adapter = auth->adapter;
3090
adapter->auth_idle_id = 0;
3092
auth->cb(NULL, auth->user_data);
3097
static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
3098
const char *uuid, service_auth_cb cb,
3101
struct service_auth *auth;
3102
struct btd_device *device;
3103
struct agent *agent;
3105
const gchar *dev_path;
3108
ba2str(dst, address);
3109
device = adapter_find_device(adapter, address);
3113
/* Device connected? */
3114
if (!g_slist_find(adapter->connections, device))
3115
error("Authorization request for non-connected device!?");
3117
if (adapter->auth_idle_id)
3120
auth = g_try_new0(struct service_auth, 1);
3125
auth->user_data = user_data;
3126
auth->device = device;
3127
auth->adapter = adapter;
3129
if (device_is_trusted(device) == TRUE) {
3130
adapter->auth_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
3136
agent = device_get_agent(device);
3138
warn("Can't find device agent");
3143
dev_path = device_get_path(device);
3145
err = agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth, g_free);
3149
device_set_authorizing(device, TRUE);
3154
int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3155
const char *uuid, service_auth_cb cb,
3158
struct btd_adapter *adapter;
3161
if (bacmp(src, BDADDR_ANY) != 0) {
3162
adapter = manager_find_adapter(src);
3166
return adapter_authorize(adapter, dst, uuid, cb, user_data);
3169
for (l = manager_get_adapters(); l != NULL; l = g_slist_next(l)) {
3174
err = adapter_authorize(adapter, dst, uuid, cb, user_data);
3182
int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3184
struct btd_adapter *adapter = manager_find_adapter(src);
3185
struct btd_device *device;
3186
struct agent *agent;
3193
ba2str(dst, address);
3194
device = adapter_find_device(adapter, address);
3198
if (adapter->auth_idle_id) {
3199
g_source_remove(adapter->auth_idle_id);
3200
adapter->auth_idle_id = 0;
3205
* FIXME: Cancel fails if authorization is requested to adapter's
3206
* agent and in the meanwhile CreatePairedDevice is called.
3209
agent = device_get_agent(device);
3213
err = agent_cancel(agent);
3216
device_set_authorizing(device, FALSE);
3221
static gchar *adapter_any_path = NULL;
3222
static int adapter_any_refcount = 0;
3224
const char *adapter_any_get_path(void)
3226
return adapter_any_path;
3229
const char *btd_adapter_any_request_path(void)
3231
if (adapter_any_refcount++ > 0)
3232
return adapter_any_path;
3234
adapter_any_path = g_strdup_printf("%s/any", manager_get_base_path());
3236
return adapter_any_path;
3239
void btd_adapter_any_release_path(void)
3241
adapter_any_refcount--;
3243
if (adapter_any_refcount > 0)
3246
g_free(adapter_any_path);
3247
adapter_any_path = NULL;
3250
gboolean adapter_powering_down(struct btd_adapter *adapter)
3252
return adapter->off_requested;
3255
int btd_adapter_restore_powered(struct btd_adapter *adapter)
3257
char mode[14], address[18];
3262
if (!main_opts.remember_powered)
3268
ba2str(&adapter->bdaddr, address);
3269
if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
3270
g_str_equal(mode, "off"))
3273
return adapter_ops->set_powered(adapter->dev_id, TRUE);
3276
static gboolean switch_off_timeout(gpointer user_data)
3278
struct btd_adapter *adapter = user_data;
3280
adapter_ops->set_powered(adapter->dev_id, FALSE);
3281
adapter->off_timer = 0;
3286
int btd_adapter_switch_online(struct btd_adapter *adapter)
3294
if (adapter->off_timer)
3295
off_timer_remove(adapter);
3297
return adapter_ops->set_powered(adapter->dev_id, TRUE);
3300
int btd_adapter_switch_offline(struct btd_adapter *adapter)
3308
if (adapter->off_timer)
3311
adapter->global_mode = MODE_OFF;
3313
if (adapter->connections == NULL)
3314
return adapter_ops->set_powered(adapter->dev_id, FALSE);
3316
g_slist_foreach(adapter->connections,
3317
(GFunc) device_request_disconnect, NULL);
3319
adapter->off_timer = g_timeout_add_seconds(OFF_TIMER,
3320
switch_off_timeout, adapter);
3325
static gboolean disable_auto(gpointer user_data)
3327
struct btd_adapter *adapter = user_data;
3330
for (l = adapter->devices; l; l = l->next) {
3331
struct btd_device *device = l->data;
3333
device_set_auto_connect(device, FALSE);
3336
adapter->auto_timeout_id = 0;
3341
static void set_auto_connect(gpointer data, gpointer user_data)
3343
struct btd_device *device = data;
3345
device_set_auto_connect(device, TRUE);
3348
void btd_adapter_enable_auto_connect(struct btd_adapter *adapter)
3353
DBG("Enabling automatic connections");
3355
if (adapter->auto_timeout_id)
3358
g_slist_foreach(adapter->devices, set_auto_connect, NULL);
3360
adapter->auto_timeout_id = g_timeout_add_seconds(main_opts.autoto,
3361
disable_auto, adapter);
3364
void btd_adapter_register_pin_cb(struct btd_adapter *adapter,
3365
btd_adapter_pin_cb_t cb)
3367
adapter->pin_callbacks = g_slist_prepend(adapter->pin_callbacks, cb);
3370
void btd_adapter_unregister_pin_cb(struct btd_adapter *adapter,
3371
btd_adapter_pin_cb_t cb)
3373
adapter->pin_callbacks = g_slist_remove(adapter->pin_callbacks, cb);
3376
ssize_t btd_adapter_get_pin(struct btd_adapter *adapter, struct btd_device *dev,
3377
char *pin_buf, gboolean *display)
3380
btd_adapter_pin_cb_t cb;
3384
for (l = adapter->pin_callbacks; l != NULL; l = g_slist_next(l)) {
3386
ret = cb(adapter, dev, pin_buf, display);
3391
adapter_get_address(adapter, &sba);
3392
device_get_address(dev, &dba, NULL);
3394
return read_pin_code(&sba, &dba, pin_buf);
3397
int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
3399
if (ops->setup == NULL)
3403
ops_candidates = g_slist_prepend(ops_candidates, ops);
3405
ops_candidates = g_slist_append(ops_candidates, ops);
3410
void btd_adapter_cleanup_ops(struct btd_adapter_ops *ops)
3412
ops_candidates = g_slist_remove(ops_candidates, ops);
3415
if (adapter_ops == ops)
3419
int adapter_ops_setup(void)
3424
if (!ops_candidates)
3427
for (l = ops_candidates; l != NULL; l = g_slist_next(l)) {
3428
struct btd_adapter_ops *ops = l->data;
3441
void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
3442
btd_adapter_powered_cb cb)
3444
adapter->powered_callbacks =
3445
g_slist_append(adapter->powered_callbacks, cb);
3448
void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
3449
btd_adapter_powered_cb cb)
3451
adapter->powered_callbacks =
3452
g_slist_remove(adapter->powered_callbacks, cb);
3455
int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
3464
return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
3467
int btd_adapter_read_clock(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3468
int which, int timeout, uint32_t *clock,
3477
return adapter_ops->read_clock(adapter->dev_id, bdaddr, which,
3478
timeout, clock, accuracy);
3481
int btd_adapter_disconnect_device(struct btd_adapter *adapter,
3482
bdaddr_t *bdaddr, uint8_t bdaddr_type)
3485
return adapter_ops->disconnect(adapter->dev_id, bdaddr, bdaddr_type);
3488
int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3489
uint8_t bdaddr_type)
3491
return adapter_ops->remove_bonding(adapter->dev_id, bdaddr,
3495
int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3496
const char *pin, size_t pin_len)
3498
return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin,
3502
int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3503
uint8_t bdaddr_type, gboolean success)
3505
return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, bdaddr_type,
3509
int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3510
uint8_t bdaddr_type, uint32_t passkey)
3512
return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, bdaddr_type,
3516
int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3517
bt_hci_result_t cb, gpointer user_data)
3519
return adapter_ops->encrypt_link(adapter->dev_id, bdaddr, cb, user_data);
3522
int btd_adapter_set_did(struct btd_adapter *adapter, uint16_t vendor,
3523
uint16_t product, uint16_t version,
3526
return adapter_ops->set_did(adapter->dev_id, vendor, product, version,
3530
int adapter_create_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3531
uint8_t addr_type, uint8_t io_cap)
3533
suspend_discovery(adapter);
3534
return adapter_ops->create_bonding(adapter->dev_id, bdaddr,
3538
int adapter_cancel_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3540
return adapter_ops->cancel_bonding(adapter->dev_id, bdaddr);
3543
void adapter_bonding_complete(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3546
struct btd_device *device;
3549
ba2str(bdaddr, addr);
3551
device = adapter_get_device(connection, adapter, addr);
3553
device = adapter_find_device(adapter, addr);
3556
device_bonding_complete(device, status);
3558
if (adapter->discov_suspended) {
3559
adapter->discov_suspended = FALSE;
3560
adapter_ops->start_discovery(adapter->dev_id);
3564
int btd_adapter_read_local_oob_data(struct btd_adapter *adapter)
3566
return adapter_ops->read_local_oob_data(adapter->dev_id);
3569
int btd_adapter_add_remote_oob_data(struct btd_adapter *adapter,
3570
bdaddr_t *bdaddr, uint8_t *hash, uint8_t *randomizer)
3572
return adapter_ops->add_remote_oob_data(adapter->dev_id, bdaddr, hash,
3576
int btd_adapter_remove_remote_oob_data(struct btd_adapter *adapter,
3579
return adapter_ops->remove_remote_oob_data(adapter->dev_id, bdaddr);