3
* BlueZ - Bluetooth protocol stack for Linux
5
* Copyright (C) 2006-2007 Nokia Corporation
6
* Copyright (C) 2004-2008 Marcel Holtmann <marcel@holtmann.org>
9
* This program is free software; you can redistribute it and/or modify
10
* it under the terms of the GNU General Public License as published by
11
* the Free Software Foundation; either version 2 of the License, or
12
* (at your option) any later version.
14
* This program is distributed in the hope that it will be useful,
15
* but WITHOUT ANY WARRANTY; without even the implied warranty of
16
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17
* GNU General Public License for more details.
19
* You should have received a copy of the GNU General Public License
20
* along with this program; if not, write to the Free Software
21
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
35
#include <sys/ioctl.h>
37
#include <bluetooth/bluetooth.h>
38
#include <bluetooth/hci.h>
39
#include <bluetooth/hci_lib.h>
40
#include <bluetooth/l2cap.h>
41
#include <bluetooth/sdp.h>
42
#include <bluetooth/sdp_lib.h>
45
#include <dbus/dbus.h>
57
#include "dbus-common.h"
60
#include "glib-helper.h"
64
#define NUM_ELEMENTS(table) (sizeof(table)/sizeof(const char *))
66
#define IO_CAPABILITY_DISPLAYONLY 0x00
67
#define IO_CAPABILITY_DISPLAYYESNO 0x01
68
#define IO_CAPABILITY_KEYBOARDONLY 0x02
69
#define IO_CAPABILITY_NOINPUTOUTPUT 0x03
70
#define IO_CAPABILITY_INVALID 0xFF
72
#define check_address(address) bachk(address)
74
static DBusConnection *connection = NULL;
75
static GSList *adapter_drivers = NULL;
78
struct btd_adapter *adapter;
79
DBusConnection *conn; /* Connection reference */
80
DBusMessage *msg; /* Message reference */
81
guint id; /* Listener id */
82
uint8_t mode; /* Requested mode */
83
int refcount; /* Session refcount */
94
char *path; /* adapter object path */
95
bdaddr_t bdaddr; /* adapter Bluetooth Address */
96
guint discov_timeout_id; /* discoverable timeout id */
97
uint32_t discov_timeout; /* discoverable time(msec) */
98
uint8_t scan_mode; /* scan mode: SCAN_DISABLED, SCAN_PAGE, SCAN_INQUIRY */
99
uint8_t mode; /* off, connectable, discoverable, limited */
100
uint8_t global_mode; /* last valid global mode */
101
int state; /* standard inq, periodic inq, name resloving */
102
GSList *found_devices;
103
GSList *oor_devices; /* out of range device list */
104
DBusMessage *discovery_cancel; /* discovery cancel message request */
105
GSList *passkey_agents;
106
struct agent *agent; /* For the new API */
108
struct bonding_request_info *bonding;
109
GSList *auth_reqs; /* Received and replied HCI
110
authentication requests */
111
GSList *devices; /* Devices structure pointers */
112
GSList *mode_sessions; /* Request Mode sessions */
113
GSList *disc_sessions; /* Discovery sessions */
114
guint scheduler_id; /* Scheduler handle */
116
struct hci_dev dev; /* hci info */
119
static inline DBusMessage *invalid_args(DBusMessage *msg)
121
return g_dbus_create_error(msg, ERROR_INTERFACE ".InvalidArguments",
122
"Invalid arguments in method call");
125
static inline DBusMessage *not_available(DBusMessage *msg)
127
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAvailable",
131
static inline DBusMessage *adapter_not_ready(DBusMessage *msg)
133
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotReady",
134
"Adapter is not ready");
137
static inline DBusMessage *no_such_adapter(DBusMessage *msg)
139
return g_dbus_create_error(msg, ERROR_INTERFACE ".NoSuchAdapter",
143
static inline DBusMessage *failed_strerror(DBusMessage *msg, int err)
145
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
149
static inline DBusMessage *in_progress(DBusMessage *msg, const char *str)
151
return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", str);
154
static inline DBusMessage *not_in_progress(DBusMessage *msg, const char *str)
156
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotInProgress", str);
159
static inline DBusMessage *not_authorized(DBusMessage *msg)
161
return g_dbus_create_error(msg, ERROR_INTERFACE ".NotAuthorized",
165
static inline DBusMessage *unsupported_major_class(DBusMessage *msg)
167
return g_dbus_create_error(msg,
168
ERROR_INTERFACE ".UnsupportedMajorClass",
169
"Unsupported Major Class");
172
static DBusHandlerResult error_failed(DBusConnection *conn,
173
DBusMessage *msg, const char * desc)
175
return error_common_reply(conn, msg, ERROR_INTERFACE ".Failed", desc);
178
static DBusHandlerResult error_failed_errno(DBusConnection *conn,
179
DBusMessage *msg, int err)
181
const char *desc = strerror(err);
183
return error_failed(conn, msg, desc);
186
static DBusHandlerResult error_connection_attempt_failed(DBusConnection *conn,
187
DBusMessage *msg, int err)
189
return error_common_reply(conn, msg,
190
ERROR_INTERFACE ".ConnectionAttemptFailed",
191
err > 0 ? strerror(err) : "Connection attempt failed");
194
static void bonding_request_free(struct bonding_request_info *bonding)
196
struct btd_device *device;
204
dbus_message_unref(bonding->msg);
207
dbus_connection_unref(bonding->conn);
210
g_io_channel_unref(bonding->io);
212
ba2str(&bonding->bdaddr, address);
214
device = adapter_find_device(bonding->adapter, address);
215
agent = device_get_agent(device);
217
if (device && agent) {
218
agent_destroy(agent, FALSE);
219
device_set_agent(device, NULL);
225
static int active_conn_find_by_bdaddr(const void *data, const void *user_data)
227
const struct active_conn_info *con = data;
228
const bdaddr_t *bdaddr = user_data;
230
return bacmp(&con->bdaddr, bdaddr);
233
static int active_conn_find_by_handle(const void *data, const void *user_data)
235
const struct active_conn_info *dev = data;
236
const uint16_t *handle = user_data;
238
if (dev->handle == *handle)
244
static void send_out_of_range(const char *path, GSList *l)
247
const char *peer_addr = l->data;
249
g_dbus_emit_signal(connection, path,
250
ADAPTER_INTERFACE, "DeviceDisappeared",
251
DBUS_TYPE_STRING, &peer_addr,
258
static int found_device_cmp(const struct remote_dev_info *d1,
259
const struct remote_dev_info *d2)
263
if (bacmp(&d2->bdaddr, BDADDR_ANY)) {
264
ret = bacmp(&d1->bdaddr, &d2->bdaddr);
269
if (d2->name_status != NAME_ANY) {
270
ret = (d1->name_status - d2->name_status);
278
static int auth_req_cmp(const void *p1, const void *p2)
280
const struct pending_auth_info *pb1 = p1;
281
const bdaddr_t *bda = p2;
283
return bda ? bacmp(&pb1->bdaddr, bda) : -1;
286
struct pending_auth_info *adapter_find_auth_request(struct btd_adapter *adapter,
291
l = g_slist_find_custom(adapter->auth_reqs, dba, auth_req_cmp);
298
void adapter_remove_auth_request(struct btd_adapter *adapter, bdaddr_t *dba)
301
struct pending_auth_info *auth;
303
l = g_slist_find_custom(adapter->auth_reqs, dba, auth_req_cmp);
309
adapter->auth_reqs = g_slist_remove(adapter->auth_reqs, auth);
314
struct pending_auth_info *adapter_new_auth_request(struct btd_adapter *adapter,
318
struct pending_auth_info *info;
320
debug("hcid_dbus_new_auth_request");
322
info = g_new0(struct pending_auth_info, 1);
324
bacpy(&info->bdaddr, dba);
326
adapter->auth_reqs = g_slist_append(adapter->auth_reqs, info);
328
if (adapter->bonding && !bacmp(dba, &adapter->bonding->bdaddr))
329
adapter->bonding->auth_active = 1;
334
int pending_remote_name_cancel(struct btd_adapter *adapter)
336
struct remote_dev_info *dev, match;
340
/* find the pending remote name request */
341
memset(&match, 0, sizeof(struct remote_dev_info));
342
bacpy(&match.bdaddr, BDADDR_ANY);
343
match.name_status = NAME_REQUESTED;
345
l = g_slist_find_custom(adapter->found_devices, &match,
346
(GCompareFunc) found_device_cmp);
347
if (!l) /* no pending request */
350
dd = hci_open_dev(adapter->dev_id);
356
if (hci_read_remote_name_cancel(dd, &dev->bdaddr,
357
HCI_REQ_TIMEOUT) < 0) {
358
error("Remote name cancel failed: %s(%d)", strerror(errno), errno);
362
/* free discovered devices list */
363
g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL);
364
g_slist_free(adapter->found_devices);
365
adapter->found_devices = NULL;
371
static int auth_info_agent_cmp(const void *a, const void *b)
373
const struct pending_auth_info *auth = a;
374
const struct agent *agent = b;
376
if (auth->agent == agent)
382
static void device_agent_removed(struct agent *agent, void *user_data)
384
struct btd_device *device = user_data;
385
struct pending_auth_info *auth;
387
struct btd_adapter *adapter;
389
adapter = device_get_adapter(device);
390
device_set_agent(device, NULL);
392
l = g_slist_find_custom(adapter->auth_reqs, agent,
393
auth_info_agent_cmp);
401
static struct bonding_request_info *bonding_request_new(DBusConnection *conn,
403
struct btd_adapter *adapter,
405
const char *agent_path,
408
struct bonding_request_info *bonding;
409
struct btd_device *device;
410
const char *name = dbus_message_get_sender(msg);
415
debug("bonding_request_new(%s)", address);
417
device = adapter_get_device(conn, adapter, address);
421
device_get_address(device, &bdaddr);
422
ba2str(&bdaddr, addr);
424
agent = agent_create(adapter, name, agent_path,
426
device_agent_removed,
429
device_set_agent(device, agent);
431
debug("Temporary agent registered for hci%d/%s at %s:%s",
432
adapter->dev_id, addr, name,
435
bonding = g_new0(struct bonding_request_info, 1);
437
bonding->conn = dbus_connection_ref(conn);
438
bonding->msg = dbus_message_ref(msg);
439
bonding->adapter = adapter;
441
str2ba(address, &bonding->bdaddr);
446
static const char *mode2str(uint8_t mode)
451
case MODE_CONNECTABLE:
452
return "connectable";
453
case MODE_DISCOVERABLE:
454
return "discoverable";
462
static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
464
if (strcasecmp("off", mode) == 0)
466
else if (strcasecmp("connectable", mode) == 0)
467
return MODE_CONNECTABLE;
468
else if (strcasecmp("discoverable", mode) == 0)
469
return MODE_DISCOVERABLE;
470
else if (strcasecmp("limited", mode) == 0)
472
else if (strcasecmp("on", mode) == 0) {
473
char onmode[14], srcaddr[18];
475
ba2str(bdaddr, srcaddr);
476
if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
477
return MODE_CONNECTABLE;
479
return get_mode(bdaddr, onmode);
484
static DBusMessage *set_mode(DBusConnection *conn, DBusMessage *msg,
485
uint8_t new_mode, void *data)
487
struct btd_adapter *adapter = data;
489
uint8_t current_scan = adapter->scan_mode;
496
scan_enable = SCAN_DISABLED;
498
case MODE_CONNECTABLE:
499
scan_enable = SCAN_PAGE;
501
case MODE_DISCOVERABLE:
503
scan_enable = (SCAN_PAGE | SCAN_INQUIRY);
506
return invalid_args(msg);
509
/* Do reverse resolution in case of "on" mode */
510
mode = mode2str(new_mode);
512
dd = hci_open_dev(adapter->dev_id);
514
return no_such_adapter(msg);
517
(main_opts.offmode == HCID_OFFMODE_NOSCAN ||
518
(main_opts.offmode == HCID_OFFMODE_DEVDOWN &&
519
scan_enable != SCAN_DISABLED))) {
520
/* Start HCI device */
521
if (ioctl(dd, HCIDEVUP, adapter->dev_id) == 0)
522
goto done; /* on success */
524
if (errno != EALREADY) {
526
error("Can't init device hci%d: %s (%d)\n",
527
adapter->dev_id, strerror(errno), errno);
530
return failed_strerror(msg, err);
534
if (adapter->up && scan_enable == SCAN_DISABLED &&
535
main_opts.offmode == HCID_OFFMODE_DEVDOWN) {
536
if (ioctl(dd, HCIDEVDOWN, adapter->dev_id) < 0) {
538
return failed_strerror(msg, errno);
544
limited = (new_mode == MODE_LIMITED ? TRUE : FALSE);
545
err = set_limited_discoverable(dd, adapter->dev.class, limited);
548
return failed_strerror(msg, -err);
551
if (current_scan != scan_enable) {
552
struct hci_request rq;
555
memset(&rq, 0, sizeof(rq));
556
rq.ogf = OGF_HOST_CTL;
557
rq.ocf = OCF_WRITE_SCAN_ENABLE;
558
rq.cparam = &scan_enable;
559
rq.clen = sizeof(scan_enable);
561
rq.rlen = sizeof(status);
562
rq.event = EVT_CMD_COMPLETE;
564
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
566
error("Sending write scan enable command failed: %s (%d)",
567
strerror(errno), errno);
569
return failed_strerror(msg, err);
573
error("Setting scan enable failed with status 0x%02x",
576
return failed_strerror(msg, bt_error(status));
579
/* discoverable or limited */
580
if ((scan_enable & SCAN_INQUIRY) && (new_mode != adapter->mode)) {
581
if (adapter->discov_timeout_id) {
582
g_source_remove(adapter->discov_timeout_id);
583
adapter->discov_timeout_id = 0;
586
if (!adapter->mode_sessions && !adapter->discov_timeout)
587
adapter_set_discov_timeout(adapter,
588
adapter->discov_timeout * 1000);
592
write_device_mode(&adapter->bdaddr, mode);
596
adapter->mode = new_mode;
598
return dbus_message_new_method_return(msg);
601
static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
602
gboolean powered, void *data)
604
struct btd_adapter *adapter = data;
607
mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF;
609
if (mode == adapter->mode)
610
return dbus_message_new_method_return(msg);
612
return set_mode(conn, msg, mode, data);
615
static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
616
gboolean discoverable, void *data)
618
struct btd_adapter *adapter = data;
622
strmode = discoverable ? "discoverable" : "connectable";
623
mode = get_mode(&adapter->bdaddr, strmode);
625
if (mode == adapter->mode)
626
return dbus_message_new_method_return(msg);
628
return set_mode(conn, msg, mode, data);
631
static struct session_req *find_session(GSList *list, DBusMessage *msg)
634
const char *sender = dbus_message_get_sender(msg);
636
for (l = list; l; l = l->next) {
637
struct session_req *req = l->data;
638
const char *name = dbus_message_get_sender(req->msg);
640
if (g_str_equal(name, sender))
647
static void session_remove(struct session_req *req)
649
struct btd_adapter *adapter = req->adapter;
653
uint8_t mode = adapter->global_mode;
655
adapter->mode_sessions = g_slist_remove(adapter->mode_sessions,
658
for (l = adapter->mode_sessions; l; l = l->next) {
659
struct session_req *req = l->data;
661
if (req->mode > mode)
665
if (mode == adapter->mode)
668
debug("Switching to '%s' mode", mode2str(mode));
669
set_mode(req->conn, req->msg, mode, adapter);
671
adapter->disc_sessions = g_slist_remove(adapter->disc_sessions,
674
if (adapter->disc_sessions)
677
debug("Stopping discovery", mode2str(adapter->global_mode));
679
if (adapter->state & STD_INQUIRY)
680
cancel_discovery(adapter);
681
else if (adapter->scheduler_id)
682
g_source_remove(adapter->scheduler_id);
684
cancel_periodic_discovery(adapter);
689
static void session_free(struct session_req *req)
691
const char *sender = dbus_message_get_sender(req->msg);
693
info("%s session %p with %s deactivated",
694
req->mode ? "Mode" : "Discovery", req, sender);
698
dbus_message_unref(req->msg);
699
dbus_connection_unref(req->conn);
703
static struct session_req *session_ref(struct session_req *req)
707
debug("session_ref(%p): ref=%d", req, req->refcount);
712
static void session_unref(struct session_req *req)
716
debug("session_unref(%p): ref=%d", req, req->refcount);
722
g_dbus_remove_watch(req->conn, req->id);
727
static struct session_req *create_session(struct btd_adapter *adapter,
728
DBusConnection *conn, DBusMessage *msg,
729
uint8_t mode, GDBusWatchFunction cb)
731
struct session_req *req;
732
const char *sender = dbus_message_get_sender(msg);
734
req = g_new0(struct session_req, 1);
735
req->adapter = adapter;
736
req->conn = dbus_connection_ref(conn);
737
req->msg = dbus_message_ref(msg);
741
req->id = g_dbus_add_disconnect_watch(conn,
742
dbus_message_get_sender(msg),
745
info("%s session %p with %s activated",
746
req->mode ? "Mode" : "Discovery", req, sender);
748
return session_ref(req);
751
static void confirm_mode_cb(struct agent *agent, DBusError *err, void *data)
753
struct session_req *req = data;
756
if (err && dbus_error_is_set(err)) {
757
reply = dbus_message_new_error(req->msg, err->name, err->message);
758
dbus_connection_send(req->conn, reply, NULL);
759
dbus_message_unref(reply);
763
reply = set_mode(req->conn, req->msg, req->mode, req->adapter);
764
dbus_connection_send(req->conn, reply, NULL);
765
dbus_message_unref(reply);
767
if (!find_session(req->adapter->mode_sessions, req->msg))
776
static DBusMessage *confirm_mode(DBusConnection *conn, DBusMessage *msg,
777
const char *mode, void *data)
779
struct btd_adapter *adapter = data;
780
struct session_req *req;
785
return dbus_message_new_method_return(msg);
787
umode = get_mode(&adapter->bdaddr, mode);
789
req = create_session(adapter, conn, msg, umode, NULL);
791
ret = agent_confirm_mode_change(adapter->agent, mode, confirm_mode_cb,
795
return invalid_args(msg);
801
static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
806
struct btd_adapter *adapter = data;
809
if (adapter->discov_timeout == timeout && timeout == 0)
810
return dbus_message_new_method_return(msg);
812
if (adapter->discov_timeout_id) {
813
g_source_remove(adapter->discov_timeout_id);
814
adapter->discov_timeout_id = 0;
817
if ((timeout != 0) && (adapter->scan_mode & SCAN_INQUIRY))
818
adapter_set_discov_timeout(adapter, timeout * 1000);
820
adapter->discov_timeout = timeout;
822
write_discoverable_timeout(&adapter->bdaddr, timeout);
824
path = dbus_message_get_path(msg);
826
dbus_connection_emit_property_changed(conn, path,
828
"DiscoverableTimeout",
829
DBUS_TYPE_UINT32, &timeout);
831
return dbus_message_new_method_return(msg);
834
static void update_ext_inquiry_response(int dd, struct hci_dev *dev)
836
uint8_t fec = 0, data[240];
838
if (!(dev->features[6] & LMP_EXT_INQ))
841
memset(data, 0, sizeof(data));
843
if (dev->ssp_mode > 0)
844
create_ext_inquiry_response((char *) dev->name, data);
846
if (hci_write_ext_inquiry_response(dd, fec, data,
847
HCI_REQ_TIMEOUT) < 0)
848
error("Can't write extended inquiry response: %s (%d)",
849
strerror(errno), errno);
852
static int adapter_set_name(struct btd_adapter *adapter, const char *name)
854
struct hci_dev *dev = &adapter->dev;
857
write_local_name(&adapter->bdaddr, (char *) name);
862
dd = hci_open_dev(adapter->dev_id);
865
error("Can't open device hci%d: %s (%d)",
866
adapter->dev_id, strerror(err), err);
870
if (hci_write_local_name(dd, name, HCI_REQ_TIMEOUT) < 0) {
872
error("Can't write name for hci%d: %s (%d)",
873
adapter->dev_id, strerror(err), err);
878
strncpy((char *) dev->name, name, 248);
880
update_ext_inquiry_response(dd, dev);
887
static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
888
const char *name, void *data)
890
struct btd_adapter *adapter = data;
894
if (!g_utf8_validate(name, -1, NULL)) {
895
error("Name change failed: the supplied name isn't valid UTF-8");
896
return invalid_args(msg);
899
ecode = adapter_set_name(adapter, name);
901
return failed_strerror(msg, -ecode);
903
path = dbus_message_get_path(msg);
905
dbus_connection_emit_property_changed(conn, path,
907
"Name", DBUS_TYPE_STRING,
910
return dbus_message_new_method_return(msg);
913
static void reply_authentication_failure(struct bonding_request_info *bonding)
918
status = bonding->hci_status ?
919
bonding->hci_status : HCI_AUTHENTICATION_FAILURE;
921
reply = new_authentication_return(bonding->msg, status);
923
dbus_connection_send(bonding->conn, reply, NULL);
924
dbus_message_unref(reply);
928
struct btd_device *adapter_find_device(struct btd_adapter *adapter, const char *dest)
930
struct btd_device *device;
936
l = g_slist_find_custom(adapter->devices,
937
dest, (GCompareFunc) device_address_cmp);
946
struct btd_device *adapter_create_device(DBusConnection *conn,
947
struct btd_adapter *adapter, const char *address)
949
struct btd_device *device;
951
debug("adapter_create_device(%s)", address);
953
device = device_create(conn, adapter, address);
957
device_set_temporary(device, TRUE);
959
adapter->devices = g_slist_append(adapter->devices, device);
964
static DBusMessage *remove_bonding(DBusConnection *conn, DBusMessage *msg,
965
const char *address, void *data)
967
struct btd_adapter *adapter = data;
968
struct btd_device *device;
969
char filename[PATH_MAX + 1];
970
char *str, srcaddr[18];
976
str2ba(address, &dst);
977
ba2str(&adapter->bdaddr, srcaddr);
979
dev = hci_open_dev(adapter->dev_id);
981
return no_such_adapter(msg);
983
create_name(filename, PATH_MAX, STORAGEDIR, srcaddr,
986
/* textfile_del doesn't return an error when the key is not found */
987
str = textfile_caseget(filename, address);
988
paired = str ? TRUE : FALSE;
991
if (!paired && msg) {
993
return g_dbus_create_error(msg,
994
ERROR_INTERFACE ".DoesNotExist",
995
"Bonding does not exist");
998
/* Delete the link key from storage */
999
if (textfile_casedel(filename, address) < 0 && msg) {
1002
return failed_strerror(msg, err);
1005
/* Delete the link key from the Bluetooth chip */
1006
hci_delete_stored_link_key(dev, &dst, 0, HCI_REQ_TIMEOUT);
1008
/* find the connection */
1009
l = g_slist_find_custom(adapter->active_conn, &dst,
1010
active_conn_find_by_bdaddr);
1012
struct active_conn_info *con = l->data;
1013
/* Send the HCI disconnect command */
1014
if ((hci_disconnect(dev, htobs(con->handle),
1015
HCI_OE_USER_ENDED_CONNECTION,
1016
HCI_REQ_TIMEOUT) < 0)
1019
error("Disconnect failed");
1021
return failed_strerror(msg, err);
1027
device = adapter_find_device(adapter, address);
1032
gboolean paired = FALSE;
1034
const gchar *dev_path = device_get_path(device);
1036
dbus_connection_emit_property_changed(conn, dev_path,
1037
DEVICE_INTERFACE, "Paired",
1038
DBUS_TYPE_BOOLEAN, &paired);
1045
return dbus_message_new_method_return(msg);
1052
void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
1053
struct btd_device *device)
1056
const gchar *dev_path = device_get_path(device);
1057
struct agent *agent;
1060
device_get_address(device, &dst);
1061
ba2str(&dst, dstaddr);
1063
delete_entry(&adapter->bdaddr, "profiles", dstaddr);
1064
adapter->devices = g_slist_remove(adapter->devices, device);
1066
if (!device_is_temporary(device)) {
1067
remove_bonding(conn, NULL, dstaddr, adapter);
1069
g_dbus_emit_signal(conn, adapter->path,
1072
DBUS_TYPE_OBJECT_PATH, &dev_path,
1075
adapter_update_devices(adapter);
1078
agent = device_get_agent(device);
1081
agent_destroy(agent, FALSE);
1082
device_set_agent(device, NULL);
1085
device_remove(conn, device);
1088
struct btd_device *adapter_get_device(DBusConnection *conn,
1089
struct btd_adapter *adapter, const gchar *address)
1091
struct btd_device *device;
1093
debug("adapter_get_device(%s)", address);
1098
device = adapter_find_device(adapter, address);
1102
return adapter_create_device(conn, adapter, address);
1105
void remove_pending_device(struct btd_adapter *adapter)
1107
struct btd_device *device;
1110
ba2str(&adapter->bonding->bdaddr, address);
1111
device = adapter_find_device(adapter, address);
1115
if (device_is_temporary(device))
1116
adapter_remove_device(adapter->bonding->conn, adapter, device);
1119
static gboolean create_bonding_conn_complete(GIOChannel *io, GIOCondition cond,
1120
struct btd_adapter *adapter)
1122
struct hci_request rq;
1123
auth_requested_cp cp;
1125
struct l2cap_conninfo cinfo;
1129
if (!adapter->bonding) {
1130
/* If we come here it implies a bug somewhere */
1131
debug("create_bonding_conn_complete: no pending bonding!");
1132
g_io_channel_close(io);
1136
if (cond & G_IO_NVAL) {
1138
reply = new_authentication_return(adapter->bonding->msg, 0x09);
1139
g_dbus_send_message(adapter->bonding->conn, reply);
1143
if (cond & (G_IO_HUP | G_IO_ERR)) {
1144
debug("Hangup or error on bonding IO channel");
1146
if (!adapter->bonding->auth_active)
1147
error_connection_attempt_failed(adapter->bonding->conn,
1148
adapter->bonding->msg,
1151
reply_authentication_failure(adapter->bonding);
1156
sk = g_io_channel_unix_get_fd(io);
1159
if (getsockopt(sk, SOL_SOCKET, SO_ERROR, &ret, &len) < 0) {
1160
error("Can't get socket error: %s (%d)",
1161
strerror(errno), errno);
1162
error_failed_errno(adapter->bonding->conn, adapter->bonding->msg,
1168
if (adapter->bonding->auth_active)
1169
reply_authentication_failure(adapter->bonding);
1171
error_connection_attempt_failed(adapter->bonding->conn,
1172
adapter->bonding->msg,
1177
len = sizeof(cinfo);
1178
if (getsockopt(sk, SOL_L2CAP, L2CAP_CONNINFO, &cinfo, &len) < 0) {
1179
error("Can't get connection info: %s (%d)",
1180
strerror(errno), errno);
1181
error_failed_errno(adapter->bonding->conn, adapter->bonding->msg,
1186
dd = hci_open_dev(adapter->dev_id);
1188
DBusMessage *reply = no_such_adapter(adapter->bonding->msg);
1189
g_dbus_send_message(adapter->bonding->conn, reply);
1193
memset(&rp, 0, sizeof(rp));
1195
memset(&cp, 0, sizeof(cp));
1196
cp.handle = htobs(cinfo.hci_handle);
1198
memset(&rq, 0, sizeof(rq));
1199
rq.ogf = OGF_LINK_CTL;
1200
rq.ocf = OCF_AUTH_REQUESTED;
1202
rq.clen = AUTH_REQUESTED_CP_SIZE;
1204
rq.rlen = EVT_CMD_STATUS_SIZE;
1205
rq.event = EVT_CMD_STATUS;
1207
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
1208
error("Unable to send HCI request: %s (%d)",
1209
strerror(errno), errno);
1210
error_failed_errno(adapter->bonding->conn, adapter->bonding->msg,
1217
error("HCI_Authentication_Requested failed with status 0x%02x",
1219
error_failed_errno(adapter->bonding->conn, adapter->bonding->msg,
1220
bt_error(rp.status));
1227
adapter->bonding->auth_active = 1;
1229
adapter->bonding->io_id = g_io_add_watch(io,
1230
G_IO_NVAL | G_IO_HUP | G_IO_ERR,
1231
(GIOFunc) create_bonding_conn_complete,
1237
g_io_channel_close(io);
1238
remove_pending_device(adapter);
1241
g_dbus_remove_watch(adapter->bonding->conn,
1242
adapter->bonding->listener_id);
1243
bonding_request_free(adapter->bonding);
1244
adapter->bonding = NULL;
1249
static void cancel_auth_request(struct pending_auth_info *auth, int dev_id)
1256
dd = hci_open_dev(dev_id);
1258
error("hci_open_dev: %s (%d)", strerror(errno), errno);
1262
switch (auth->type) {
1263
case AUTH_TYPE_PINCODE:
1264
hci_send_cmd(dd, OGF_LINK_CTL, OCF_PIN_CODE_NEG_REPLY,
1267
case AUTH_TYPE_CONFIRM:
1268
hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_CONFIRM_NEG_REPLY,
1271
case AUTH_TYPE_PASSKEY:
1272
hci_send_cmd(dd, OGF_LINK_CTL, OCF_USER_PASSKEY_NEG_REPLY,
1275
case AUTH_TYPE_NOTIFY:
1276
/* User Notify doesn't require any reply */
1280
auth->replied = TRUE;
1285
static void cancel_bonding(struct btd_adapter *adapter, gboolean exited)
1287
struct pending_auth_info *auth;
1288
struct bonding_request_info *bonding = adapter->bonding;
1290
auth = adapter_find_auth_request(adapter, &adapter->bdaddr);
1292
cancel_auth_request(auth, adapter->dev_id);
1294
agent_cancel(auth->agent);
1295
adapter_remove_auth_request(adapter, &bonding->bdaddr);
1298
remove_pending_device(adapter);
1301
g_io_channel_close(bonding->io);
1304
if (bonding->io_id) {
1305
g_source_remove(bonding->io_id);
1308
bonding_request_free(bonding);
1309
adapter->bonding = NULL;
1312
bonding->cancel = TRUE;
1315
static void create_bond_req_exit(void *user_data)
1317
struct btd_adapter *adapter = user_data;
1319
debug("CreateConnection requestor exited before bonding was completed");
1321
cancel_bonding(adapter, TRUE);
1324
static DBusMessage *create_bonding(DBusConnection *conn, DBusMessage *msg,
1325
const char *address, const char *agent_path,
1326
uint8_t capability, void *data)
1328
char filename[PATH_MAX + 1];
1329
char *str, srcaddr[18];
1330
struct btd_adapter *adapter = data;
1331
struct bonding_request_info *bonding;
1335
str2ba(address, &dst);
1336
ba2str(&adapter->bdaddr, srcaddr);
1338
/* check if there is a pending discover: requested by D-Bus/non clients */
1339
if (adapter->state & STD_INQUIRY)
1340
return in_progress(msg, "Discover in progress");
1342
pending_remote_name_cancel(adapter);
1344
if (adapter->bonding)
1345
return in_progress(msg, "Bonding in progress");
1347
if (adapter_find_auth_request(adapter, &dst))
1348
return in_progress(msg, "Bonding in progress");
1350
/* check if a link key already exists */
1351
create_name(filename, PATH_MAX, STORAGEDIR, srcaddr,
1354
str = textfile_caseget(filename, address);
1357
return g_dbus_create_error(msg,
1358
ERROR_INTERFACE ".AlreadyExists",
1359
"Bonding already exists");
1362
sk = l2raw_connect(&adapter->bdaddr, &dst);
1364
return g_dbus_create_error(msg,
1365
ERROR_INTERFACE ".ConnectionAttemptFailed",
1366
"Connection attempt failed");
1368
bonding = bonding_request_new(conn, msg, adapter, address, agent_path,
1375
bonding->io = g_io_channel_unix_new(sk);
1376
bonding->io_id = g_io_add_watch(bonding->io,
1377
G_IO_OUT | G_IO_NVAL | G_IO_HUP | G_IO_ERR,
1378
(GIOFunc) create_bonding_conn_complete,
1381
bonding->listener_id = g_dbus_add_disconnect_watch(conn,
1382
dbus_message_get_sender(msg),
1383
create_bond_req_exit, adapter,
1386
adapter->bonding = bonding;
1391
int start_inquiry(struct btd_adapter *adapter)
1395
struct hci_request rq;
1396
uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
1399
pending_remote_name_cancel(adapter);
1401
dd = hci_open_dev(adapter->dev_id);
1405
memset(&cp, 0, sizeof(cp));
1406
memcpy(&cp.lap, lap, 3);
1410
memset(&rq, 0, sizeof(rq));
1411
rq.ogf = OGF_LINK_CTL;
1412
rq.ocf = OCF_INQUIRY;
1414
rq.clen = INQUIRY_CP_SIZE;
1416
rq.rlen = EVT_CMD_STATUS_SIZE;
1417
rq.event = EVT_CMD_STATUS;
1419
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
1421
error("Unable to start inquiry: %s (%d)",
1422
strerror(err), err);
1428
err = bt_error(rp.status);
1429
error("HCI_Inquiry command failed with status 0x%02x",
1437
adapter->state |= RESOLVE_NAME;
1442
static int start_periodic_inquiry(struct btd_adapter *adapter)
1444
periodic_inquiry_cp cp;
1445
struct hci_request rq;
1446
uint8_t lap[3] = { 0x33, 0x8b, 0x9e };
1450
dd = hci_open_dev(adapter->dev_id);
1454
memset(&cp, 0, sizeof(cp));
1455
memcpy(&cp.lap, lap, 3);
1456
cp.max_period = htobs(24);
1457
cp.min_period = htobs(16);
1461
memset(&rq, 0, sizeof(rq));
1462
rq.ogf = OGF_LINK_CTL;
1463
rq.ocf = OCF_PERIODIC_INQUIRY;
1465
rq.clen = PERIODIC_INQUIRY_CP_SIZE;
1466
rq.rparam = &status;
1467
rq.rlen = sizeof(status);
1468
rq.event = EVT_CMD_COMPLETE;
1470
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
1472
error("Unable to start periodic inquiry: %s (%d)",
1473
strerror(err), err);
1479
err = bt_error(status);
1480
error("HCI_Periodic_Inquiry_Mode failed with status 0x%02x",
1488
adapter->state |= RESOLVE_NAME;
1493
static DBusMessage *adapter_start_discovery(DBusConnection *conn,
1494
DBusMessage *msg, void *data)
1496
struct session_req *req;
1497
struct btd_adapter *adapter = data;
1501
return adapter_not_ready(msg);
1503
req = find_session(adapter->disc_sessions, msg);
1506
return dbus_message_new_method_return(msg);
1509
if (adapter->disc_sessions)
1512
if (main_opts.inqmode)
1513
err = start_inquiry(adapter);
1515
err = start_periodic_inquiry(adapter);
1518
return failed_strerror(msg, -err);
1521
req = create_session(adapter, conn, msg, 0,
1522
(GDBusWatchFunction) session_free);
1524
adapter->disc_sessions = g_slist_append(adapter->disc_sessions, req);
1526
return dbus_message_new_method_return(msg);
1529
static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
1530
DBusMessage *msg, void *data)
1532
struct btd_adapter *adapter = data;
1533
struct session_req *req;
1536
return adapter_not_ready(msg);
1538
req = find_session(adapter->disc_sessions, msg);
1540
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1541
"Invalid discovery session");
1545
return dbus_message_new_method_return(msg);
1548
struct remote_device_list_t {
1553
static DBusMessage *get_properties(DBusConnection *conn,
1554
DBusMessage *msg, void *data)
1556
struct btd_adapter *adapter = data;
1557
const char *property;
1559
DBusMessageIter iter;
1560
DBusMessageIter dict;
1561
char str[249], srcaddr[18];
1567
ba2str(&adapter->bdaddr, srcaddr);
1569
if (check_address(srcaddr) < 0)
1570
return adapter_not_ready(msg);
1572
reply = dbus_message_new_method_return(msg);
1576
dbus_message_iter_init_append(reply, &iter);
1578
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1579
DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1580
DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
1581
DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1585
dbus_message_iter_append_dict_entry(&dict, "Address",
1586
DBUS_TYPE_STRING, &property);
1589
memset(str, 0, sizeof(str));
1590
strncpy(str, (char *) adapter->dev.name, 248);
1593
dbus_message_iter_append_dict_entry(&dict, "Name",
1594
DBUS_TYPE_STRING, &property);
1597
property = mode2str(adapter->mode);
1599
dbus_message_iter_append_dict_entry(&dict, "Mode",
1600
DBUS_TYPE_STRING, &property);
1603
if (main_opts.offmode == HCID_OFFMODE_DEVDOWN)
1604
value = adapter->up ? TRUE : FALSE;
1606
value = adapter->scan_mode == SCAN_DISABLED ? FALSE : TRUE;
1607
dbus_message_iter_append_dict_entry(&dict, "Powered",
1608
DBUS_TYPE_BOOLEAN, &value);
1611
value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
1612
dbus_message_iter_append_dict_entry(&dict, "Discoverable",
1613
DBUS_TYPE_BOOLEAN, &value);
1615
/* DiscoverableTimeout */
1616
dbus_message_iter_append_dict_entry(&dict, "DiscoverableTimeout",
1617
DBUS_TYPE_UINT32, &adapter->discov_timeout);
1619
if (adapter->state & PERIODIC_INQUIRY || adapter->state & STD_INQUIRY)
1625
dbus_message_iter_append_dict_entry(&dict, "Discovering",
1626
DBUS_TYPE_BOOLEAN, &value);
1629
devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1630
for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1631
struct btd_device *dev = l->data;
1632
devices[i] = (char *) device_get_path(dev);
1634
dbus_message_iter_append_dict_entry(&dict, "Devices",
1635
DBUS_TYPE_ARRAY, &devices);
1638
dbus_message_iter_close_container(&iter, &dict);
1643
static DBusMessage *set_property(DBusConnection *conn,
1644
DBusMessage *msg, void *data)
1646
struct btd_adapter *adapter = data;
1647
DBusMessageIter iter;
1648
DBusMessageIter sub;
1649
const char *property;
1652
ba2str(&adapter->bdaddr, srcaddr);
1654
if (!dbus_message_iter_init(msg, &iter))
1655
return invalid_args(msg);
1657
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1658
return invalid_args(msg);
1660
dbus_message_iter_get_basic(&iter, &property);
1661
dbus_message_iter_next(&iter);
1663
if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1664
return invalid_args(msg);
1665
dbus_message_iter_recurse(&iter, &sub);
1667
if (g_str_equal("Name", property)) {
1670
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1671
return invalid_args(msg);
1672
dbus_message_iter_get_basic(&sub, &name);
1674
return set_name(conn, msg, name, data);
1675
} else if (g_str_equal("Mode", property)) {
1678
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1679
return invalid_args(msg);
1681
dbus_message_iter_get_basic(&sub, &mode);
1683
adapter->global_mode = get_mode(&adapter->bdaddr, mode);
1685
if (adapter->global_mode == adapter->mode)
1686
return dbus_message_new_method_return(msg);
1688
if (adapter->mode_sessions && adapter->global_mode < adapter->mode)
1689
return confirm_mode(conn, msg, mode, data);
1691
return set_mode(conn, msg,
1692
get_mode(&adapter->bdaddr, mode), data);
1693
} else if (g_str_equal("Powered", property)) {
1696
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1697
return invalid_args(msg);
1699
dbus_message_iter_get_basic(&sub, &powered);
1701
return set_powered(conn, msg, powered, data);
1702
} else if (g_str_equal("Discoverable", property)) {
1703
gboolean discoverable;
1705
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1706
return invalid_args(msg);
1708
dbus_message_iter_get_basic(&sub, &discoverable);
1710
return set_discoverable(conn, msg, discoverable, data);
1711
} else if (g_str_equal("DiscoverableTimeout", property)) {
1714
if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1715
return invalid_args(msg);
1717
dbus_message_iter_get_basic(&sub, &timeout);
1719
return set_discoverable_timeout(conn, msg, timeout, data);
1722
return invalid_args(msg);
1725
static DBusMessage *mode_request(DBusConnection *conn,
1726
DBusMessage *msg, const char *mode,
1729
struct btd_adapter *adapter = data;
1730
struct session_req *req;
1735
ba2str(&adapter->bdaddr, srcaddr);
1737
new_mode = get_mode(&adapter->bdaddr, mode);
1738
if (new_mode != MODE_CONNECTABLE && new_mode != MODE_DISCOVERABLE)
1739
return invalid_args(msg);
1741
if (!adapter->agent)
1742
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1743
"No agent registered");
1745
if (!adapter->mode_sessions)
1746
adapter->global_mode = adapter->mode;
1748
req = find_session(adapter->mode_sessions, msg);
1750
req = create_session(adapter, conn, msg, new_mode,
1751
(GDBusWatchFunction) session_free);
1752
adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1755
req->mode = new_mode;
1756
adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1758
session_remove(req);
1759
return dbus_message_new_method_return(msg);
1762
/* No need to change mode */
1763
if (adapter->mode >= new_mode)
1764
return dbus_message_new_method_return(msg);
1766
ret = agent_confirm_mode_change(adapter->agent, mode, confirm_mode_cb,
1770
return invalid_args(msg);
1776
static DBusMessage *request_mode(DBusConnection *conn,
1777
DBusMessage *msg, void *data)
1781
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &mode,
1783
return invalid_args(msg);
1785
return mode_request(conn, msg, mode, data);
1788
static DBusMessage *request_session(DBusConnection *conn,
1789
DBusMessage *msg, void *data)
1791
return mode_request(conn, msg, "connectable", data);
1794
static DBusMessage *release_session(DBusConnection *conn,
1795
DBusMessage *msg, void *data)
1797
struct btd_adapter *adapter = data;
1798
struct session_req *req;
1800
req = find_session(adapter->mode_sessions, msg);
1802
return g_dbus_create_error(msg, ERROR_INTERFACE ".Failed",
1803
"No Mode to release");
1807
return dbus_message_new_method_return(msg);
1810
static DBusMessage *list_devices(DBusConnection *conn,
1811
DBusMessage *msg, void *data)
1813
struct btd_adapter *adapter = data;
1816
DBusMessageIter iter;
1817
DBusMessageIter array_iter;
1818
const gchar *dev_path;
1820
if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
1821
return invalid_args(msg);
1823
reply = dbus_message_new_method_return(msg);
1827
dbus_message_iter_init_append(reply, &iter);
1828
dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1829
DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
1831
for (l = adapter->devices; l; l = l->next) {
1832
struct btd_device *device = l->data;
1834
if (device_is_temporary(device))
1837
dev_path = device_get_path(device);
1839
dbus_message_iter_append_basic(&array_iter,
1840
DBUS_TYPE_OBJECT_PATH, &dev_path);
1843
dbus_message_iter_close_container(&iter, &array_iter);
1848
static DBusMessage *cancel_device_creation(DBusConnection *conn,
1849
DBusMessage *msg, void *data)
1851
struct btd_adapter *adapter = data;
1852
struct bonding_request_info *bonding = adapter->bonding;
1853
const gchar *address;
1856
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1857
DBUS_TYPE_INVALID) == FALSE)
1858
return invalid_args(msg);
1860
if (check_address(address) < 0)
1861
return invalid_args(msg);
1863
str2ba(address, &bda);
1865
if (bonding && !bacmp(&bonding->bdaddr, &bda)) {
1866
if (!g_str_equal(dbus_message_get_sender(msg),
1867
dbus_message_get_sender(bonding->msg)))
1868
return not_authorized(msg);
1870
debug("Canceling device creation for %s", address);
1871
cancel_bonding(adapter, FALSE);
1874
return dbus_message_new_method_return(msg);
1877
static DBusMessage *create_device(DBusConnection *conn,
1878
DBusMessage *msg, void *data)
1880
struct btd_adapter *adapter = data;
1881
struct btd_device *device;
1882
const gchar *address;
1884
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1885
DBUS_TYPE_INVALID) == FALSE)
1886
return invalid_args(msg);
1888
if (check_address(address) < 0)
1889
return invalid_args(msg);
1891
if (adapter_find_device(adapter, address))
1892
return g_dbus_create_error(msg,
1893
ERROR_INTERFACE ".AlreadyExists",
1894
"Device already exists");
1896
debug("create_device(%s)", address);
1898
device = device_create(conn, adapter, address);
1902
device_set_temporary(device, FALSE);
1904
device_browse(device, conn, msg, NULL);
1906
adapter->devices = g_slist_append(adapter->devices, device);
1911
static uint8_t parse_io_capability(const char *capability)
1913
if (g_str_equal(capability, ""))
1914
return IO_CAPABILITY_DISPLAYYESNO;
1915
if (g_str_equal(capability, "DisplayOnly"))
1916
return IO_CAPABILITY_DISPLAYONLY;
1917
if (g_str_equal(capability, "DisplayYesNo"))
1918
return IO_CAPABILITY_DISPLAYYESNO;
1919
if (g_str_equal(capability, "KeyboardOnly"))
1920
return IO_CAPABILITY_KEYBOARDONLY;
1921
if (g_str_equal(capability, "NoInputOutput"))
1922
return IO_CAPABILITY_NOINPUTOUTPUT;
1923
return IO_CAPABILITY_INVALID;
1926
static DBusMessage *create_paired_device(DBusConnection *conn,
1927
DBusMessage *msg, void *data)
1929
const gchar *address, *agent_path, *capability;
1932
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1933
DBUS_TYPE_OBJECT_PATH, &agent_path,
1934
DBUS_TYPE_STRING, &capability,
1935
DBUS_TYPE_INVALID) == FALSE)
1936
return invalid_args(msg);
1938
if (check_address(address) < 0)
1939
return invalid_args(msg);
1941
cap = parse_io_capability(capability);
1942
if (cap == IO_CAPABILITY_INVALID)
1943
return invalid_args(msg);
1945
return create_bonding(conn, msg, address, agent_path, cap, data);
1948
static gint device_path_cmp(struct btd_device *device, const gchar *path)
1950
const gchar *dev_path = device_get_path(device);
1952
return strcasecmp(dev_path, path);
1955
static DBusMessage *remove_device(DBusConnection *conn,
1956
DBusMessage *msg, void *data)
1958
struct btd_adapter *adapter = data;
1959
struct btd_device *device;
1963
if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
1964
DBUS_TYPE_INVALID) == FALSE)
1965
return invalid_args(msg);
1967
l = g_slist_find_custom(adapter->devices,
1968
path, (GCompareFunc) device_path_cmp);
1970
return g_dbus_create_error(msg,
1971
ERROR_INTERFACE ".DoesNotExist",
1972
"Device does not exist");
1975
if (device_is_temporary(device) || device_is_busy(device))
1976
return g_dbus_create_error(msg,
1977
ERROR_INTERFACE ".DoesNotExist",
1978
"Device creation in progress");
1980
adapter_remove_device(conn, adapter, device);
1982
return dbus_message_new_method_return(msg);
1985
static DBusMessage *find_device(DBusConnection *conn,
1986
DBusMessage *msg, void *data)
1988
struct btd_adapter *adapter = data;
1989
struct btd_device *device;
1991
const gchar *address;
1993
const gchar *dev_path;
1995
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1997
return invalid_args(msg);
1999
l = g_slist_find_custom(adapter->devices,
2000
address, (GCompareFunc) device_address_cmp);
2002
return g_dbus_create_error(msg,
2003
ERROR_INTERFACE ".DoesNotExist",
2004
"Device does not exist");
2008
if (device_is_temporary(device))
2009
return g_dbus_create_error(msg,
2010
ERROR_INTERFACE ".DoesNotExist",
2011
"Device creation in progress");
2013
reply = dbus_message_new_method_return(msg);
2017
dev_path = device_get_path(device);
2019
dbus_message_append_args(reply,
2020
DBUS_TYPE_OBJECT_PATH, &dev_path,
2026
static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
2028
struct pending_auth_info *auth;
2031
adapter->agent = NULL;
2033
l = g_slist_find_custom(adapter->auth_reqs, agent,
2034
auth_info_agent_cmp);
2042
static DBusMessage *register_agent(DBusConnection *conn,
2043
DBusMessage *msg, void *data)
2045
const char *path, *name, *capability;
2046
struct agent *agent;
2047
struct btd_adapter *adapter = data;
2050
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
2051
DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID))
2055
return g_dbus_create_error(msg,
2056
ERROR_INTERFACE ".AlreadyExists",
2057
"Agent already exists");
2059
cap = parse_io_capability(capability);
2060
if (cap == IO_CAPABILITY_INVALID)
2061
return invalid_args(msg);
2063
name = dbus_message_get_sender(msg);
2065
agent = agent_create(adapter, name, path, cap,
2066
(agent_remove_cb) agent_removed, adapter);
2068
return g_dbus_create_error(msg,
2069
ERROR_INTERFACE ".Failed",
2070
"Failed to create a new agent");
2072
adapter->agent = agent;
2074
debug("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
2077
return dbus_message_new_method_return(msg);
2080
static DBusMessage *unregister_agent(DBusConnection *conn,
2081
DBusMessage *msg, void *data)
2083
const char *path, *name;
2084
struct btd_adapter *adapter = data;
2086
if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
2090
name = dbus_message_get_sender(msg);
2092
if (!adapter->agent || !agent_matches(adapter->agent, name, path))
2093
return g_dbus_create_error(msg,
2094
ERROR_INTERFACE ".DoesNotExist",
2097
agent_destroy(adapter->agent, FALSE);
2098
adapter->agent = NULL;
2100
return dbus_message_new_method_return(msg);
2104
static GDBusMethodTable adapter_methods[] = {
2105
{ "GetProperties", "", "a{sv}",get_properties },
2106
{ "SetProperty", "sv", "", set_property,
2107
G_DBUS_METHOD_FLAG_ASYNC},
2108
{ "RequestMode", "s", "", request_mode,
2109
G_DBUS_METHOD_FLAG_ASYNC |
2110
G_DBUS_METHOD_FLAG_DEPRECATED},
2111
{ "ReleaseMode", "", "", release_session,
2112
G_DBUS_METHOD_FLAG_DEPRECATED},
2113
{ "RequestSession", "", "", request_session,
2114
G_DBUS_METHOD_FLAG_ASYNC},
2115
{ "ReleaseSession", "", "", release_session },
2116
{ "StartDiscovery", "", "", adapter_start_discovery },
2117
{ "StopDiscovery", "", "", adapter_stop_discovery,
2118
G_DBUS_METHOD_FLAG_ASYNC},
2119
{ "ListDevices", "", "ao", list_devices,
2120
G_DBUS_METHOD_FLAG_DEPRECATED},
2121
{ "CreateDevice", "s", "o", create_device,
2122
G_DBUS_METHOD_FLAG_ASYNC},
2123
{ "CreatePairedDevice", "sos", "o", create_paired_device,
2124
G_DBUS_METHOD_FLAG_ASYNC},
2125
{ "CancelDeviceCreation","s", "", cancel_device_creation },
2126
{ "RemoveDevice", "o", "", remove_device },
2127
{ "FindDevice", "s", "o", find_device },
2128
{ "RegisterAgent", "os", "", register_agent },
2129
{ "UnregisterAgent", "o", "", unregister_agent },
2133
static GDBusSignalTable adapter_signals[] = {
2134
{ "DeviceCreated", "o" },
2135
{ "DeviceRemoved", "o" },
2136
{ "DeviceFound", "sa{sv}" },
2137
{ "PropertyChanged", "sv" },
2138
{ "DeviceDisappeared", "s" },
2142
static inline uint8_t get_inquiry_mode(struct hci_dev *dev)
2144
if (dev->features[6] & LMP_EXT_INQ)
2147
if (dev->features[3] & LMP_RSSI_INQ)
2150
if (dev->manufacturer == 11 &&
2151
dev->hci_rev == 0x00 && dev->lmp_subver == 0x0757)
2154
if (dev->manufacturer == 15) {
2155
if (dev->hci_rev == 0x03 && dev->lmp_subver == 0x6963)
2157
if (dev->hci_rev == 0x09 && dev->lmp_subver == 0x6963)
2159
if (dev->hci_rev == 0x00 && dev->lmp_subver == 0x6965)
2163
if (dev->manufacturer == 31 &&
2164
dev->hci_rev == 0x2005 && dev->lmp_subver == 0x1805)
2170
static int adapter_read_bdaddr(uint16_t dev_id, bdaddr_t *bdaddr)
2174
dd = hci_open_dev(dev_id);
2177
error("Can't open device hci%d: %s (%d)",
2178
dev_id, strerror(err), err);
2182
if (hci_read_bd_addr(dd, bdaddr, HCI_REQ_TIMEOUT) < 0) {
2184
error("Can't read address for hci%d: %s (%d)",
2185
dev_id, strerror(err), err);
2195
static int adapter_setup(struct btd_adapter *adapter, int dd)
2197
struct hci_dev *dev = &adapter->dev;
2198
uint8_t events[8] = { 0xff, 0xff, 0xff, 0xff, 0xff, 0x1f, 0x00, 0x00 };
2203
if (dev->hci_rev > 1) {
2204
if (dev->features[5] & LMP_SNIFF_SUBR)
2207
if (dev->features[5] & LMP_PAUSE_ENC)
2210
if (dev->features[6] & LMP_EXT_INQ)
2213
if (dev->features[6] & LMP_NFLUSH_PKTS)
2216
if (dev->features[7] & LMP_LSTO)
2219
if (dev->features[6] & LMP_SIMPLE_PAIR) {
2220
events[6] |= 0x01; /* IO Capability Request */
2221
events[6] |= 0x02; /* IO Capability Response */
2222
events[6] |= 0x04; /* User Confirmation Request */
2223
events[6] |= 0x08; /* User Passkey Request */
2224
events[6] |= 0x10; /* Remote OOB Data Request */
2225
events[6] |= 0x20; /* Simple Pairing Complete */
2226
events[7] |= 0x04; /* User Passkey Notification */
2227
events[7] |= 0x08; /* Keypress Notification */
2228
events[7] |= 0x10; /* Remote Host Supported Features Notification */
2231
hci_send_cmd(dd, OGF_HOST_CTL, OCF_SET_EVENT_MASK,
2232
sizeof(events), events);
2235
if (read_local_name(&adapter->bdaddr, name) == 0) {
2236
memcpy(dev->name, name, 248);
2237
hci_write_local_name(dd, name, HCI_REQ_TIMEOUT);
2240
update_ext_inquiry_response(dd, dev);
2242
inqmode = get_inquiry_mode(dev);
2246
if (hci_write_inquiry_mode(dd, inqmode, HCI_REQ_TIMEOUT) < 0) {
2248
error("Can't write inquiry mode for %s: %s (%d)",
2249
adapter->path, strerror(err), err);
2257
static int active_conn_append(GSList **list, bdaddr_t *bdaddr,
2260
struct active_conn_info *dev;
2262
dev = g_new0(struct active_conn_info, 1);
2264
bacpy(&dev->bdaddr, bdaddr);
2265
dev->handle = handle;
2267
*list = g_slist_append(*list, dev);
2271
static void create_stored_device_from_profiles(char *key, char *value,
2274
struct btd_adapter *adapter = user_data;
2275
GSList *uuids = bt_string2list(value);
2276
struct btd_device *device;
2277
sdp_list_t *records;
2279
char srcaddr[18], dstaddr[18];
2281
ba2str(&adapter->bdaddr, srcaddr);
2283
if (g_slist_find_custom(adapter->devices,
2284
key, (GCompareFunc) device_address_cmp))
2287
device = device_create(connection, adapter, key);
2291
device_set_temporary(device, FALSE);
2292
adapter->devices = g_slist_append(adapter->devices, device);
2294
device_get_address(device, &dst);
2295
ba2str(&dst, dstaddr);
2297
records = read_records(srcaddr, dstaddr);
2299
device_probe_drivers(device, uuids, records);
2302
sdp_list_free(records, (sdp_free_func_t) sdp_record_free);
2304
g_slist_free(uuids);
2307
static void create_stored_device_from_linkkeys(char *key, char *value,
2310
struct btd_adapter *adapter = user_data;
2311
struct btd_device *device;
2313
if (g_slist_find_custom(adapter->devices,
2314
key, (GCompareFunc) device_address_cmp))
2317
device = device_create(connection, adapter, key);
2319
device_set_temporary(device, FALSE);
2320
adapter->devices = g_slist_append(adapter->devices, device);
2324
static void load_devices(struct btd_adapter *adapter)
2326
char filename[PATH_MAX + 1];
2329
ba2str(&adapter->bdaddr, srcaddr);
2331
create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "profiles");
2332
textfile_foreach(filename, create_stored_device_from_profiles, adapter);
2334
create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
2335
textfile_foreach(filename, create_stored_device_from_linkkeys, adapter);
2338
static void load_drivers(struct btd_adapter *adapter)
2342
for (l = adapter_drivers; l; l = l->next) {
2343
struct btd_adapter_driver *driver = l->data;
2346
driver->probe(adapter);
2350
static int get_discoverable_timeout(const char *src)
2354
if (read_discoverable_timeout(src, &timeout) == 0)
2357
return main_opts.discovto;
2360
static void adapter_up(struct btd_adapter *adapter, int dd)
2362
struct hci_conn_list_req *cl = NULL;
2363
struct hci_conn_info *ci;
2365
char mode[14], srcaddr[18];
2368
gboolean discoverable;
2370
ba2str(&adapter->bdaddr, srcaddr);
2373
adapter->discov_timeout = get_discoverable_timeout(srcaddr);
2374
adapter->state = DISCOVER_TYPE_NONE;
2377
if (read_device_mode(srcaddr, mode, sizeof(mode)) == 0) {
2378
if (!strcmp(mode, "off")) {
2379
if (main_opts.offmode == HCID_OFFMODE_NOSCAN) {
2380
adapter->mode = MODE_OFF;
2381
adapter->scan_mode= SCAN_DISABLED;
2382
} else if (main_opts.offmode == HCID_OFFMODE_DEVDOWN) {
2383
static gboolean restore_on_mode = FALSE;
2385
if (!restore_on_mode) {
2386
ioctl(dd, HCIDEVDOWN, adapter->dev_id);
2387
restore_on_mode = TRUE;
2391
if (read_on_mode(srcaddr, mode, sizeof(mode)) < 0)
2392
write_device_mode(&adapter->bdaddr, mode);
2394
write_device_mode(&adapter->bdaddr, "connectable");
2396
adapter_up(adapter, dd);
2398
} else if (!strcmp(mode, "connectable")) {
2399
adapter->mode = MODE_CONNECTABLE;
2400
adapter->scan_mode = SCAN_PAGE;
2401
} else if (!strcmp(mode, "discoverable")) {
2402
/* Set discoverable only if timeout is 0 */
2403
if (adapter->discov_timeout == 0) {
2404
adapter->mode = MODE_DISCOVERABLE;
2405
adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY;
2407
adapter->mode = MODE_CONNECTABLE;
2408
adapter->scan_mode = SCAN_PAGE;
2410
} else if (!strcmp(mode, "limited")) {
2411
/* Set discoverable only if timeout is 0 */
2412
if (adapter->discov_timeout == 0) {
2413
adapter->mode = MODE_LIMITED;
2414
adapter->scan_mode = SCAN_PAGE | SCAN_INQUIRY;
2416
adapter->mode = MODE_CONNECTABLE;
2417
adapter->scan_mode = SCAN_PAGE;
2423
hci_send_cmd(dd, OGF_HOST_CTL, OCF_WRITE_SCAN_ENABLE,
2424
1, &adapter->scan_mode);
2426
if (adapter->mode == MODE_LIMITED)
2427
set_limited_discoverable(dd, adapter->dev.class, TRUE);
2430
* retrieve the active connections: address the scenario where
2431
* the are active connections before the daemon've started
2434
cl = g_malloc0(10 * sizeof(*ci) + sizeof(*cl));
2436
cl->dev_id = adapter->dev_id;
2440
if (ioctl(dd, HCIGETCONNLIST, cl) == 0) {
2441
for (i = 0; i < cl->conn_num; i++, ci++)
2442
active_conn_append(&adapter->active_conn,
2443
&ci->bdaddr, ci->handle);
2447
pmode = mode2str(adapter->mode);
2449
dbus_connection_emit_property_changed(connection, adapter->path,
2450
ADAPTER_INTERFACE, "Mode",
2451
DBUS_TYPE_STRING, &pmode);
2453
powered = adapter->scan_mode == SCAN_DISABLED ? FALSE : TRUE;
2455
dbus_connection_emit_property_changed(connection, adapter->path,
2456
ADAPTER_INTERFACE, "Powered",
2457
DBUS_TYPE_BOOLEAN, &powered);
2459
discoverable = adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY) ? TRUE
2462
dbus_connection_emit_property_changed(connection, adapter->path,
2463
ADAPTER_INTERFACE, "Discoverable",
2464
DBUS_TYPE_BOOLEAN, &discoverable);
2466
load_drivers(adapter);
2467
load_devices(adapter);
2470
int adapter_start(struct btd_adapter *adapter)
2472
struct hci_dev *dev = &adapter->dev;
2473
struct hci_dev_info di;
2474
struct hci_version ver;
2475
uint8_t features[8];
2479
if (hci_devinfo(adapter->dev_id, &di) < 0)
2482
if (hci_test_bit(HCI_RAW, &di.flags)) {
2487
if (!bacmp(&di.bdaddr, BDADDR_ANY)) {
2490
debug("Adapter %s without an address", adapter->path);
2492
err = adapter_read_bdaddr(adapter->dev_id, &di.bdaddr);
2497
bacpy(&adapter->bdaddr, &di.bdaddr);
2498
memcpy(dev->features, di.features, 8);
2500
dd = hci_open_dev(adapter->dev_id);
2503
error("Can't open adapter %s: %s (%d)",
2504
adapter->path, strerror(err), err);
2508
if (hci_read_local_version(dd, &ver, HCI_REQ_TIMEOUT) < 0) {
2510
error("Can't read version info for %s: %s (%d)",
2511
adapter->path, strerror(err), err);
2516
dev->hci_rev = ver.hci_rev;
2517
dev->lmp_ver = ver.lmp_ver;
2518
dev->lmp_subver = ver.lmp_subver;
2519
dev->manufacturer = ver.manufacturer;
2521
if (hci_read_local_features(dd, features, HCI_REQ_TIMEOUT) < 0) {
2523
error("Can't read features for %s: %s (%d)",
2524
adapter->path, strerror(err), err);
2529
memcpy(dev->features, features, 8);
2531
if (hci_read_class_of_dev(dd, dev->class, HCI_REQ_TIMEOUT) < 0) {
2533
error("Can't read class of adapter on %s: %s (%d)",
2534
adapter->path, strerror(err), err);
2539
if (hci_read_local_name(dd, sizeof(name), name, HCI_REQ_TIMEOUT) < 0) {
2541
error("Can't read local name on %s: %s (%d)",
2542
adapter->path, strerror(err), err);
2547
memcpy(dev->name, name, 248);
2549
if (!(features[6] & LMP_SIMPLE_PAIR))
2552
if (ioctl(dd, HCIGETAUTHINFO, NULL) < 0 && errno != EINVAL)
2553
hci_write_simple_pairing_mode(dd, 0x01, HCI_REQ_TIMEOUT);
2555
if (hci_read_simple_pairing_mode(dd, &dev->ssp_mode,
2556
HCI_REQ_TIMEOUT) < 0) {
2558
error("Can't read simple pairing mode on %s: %s (%d)",
2559
adapter->path, strerror(err), err);
2565
hci_send_cmd(dd, OGF_LINK_POLICY,
2566
OCF_READ_DEFAULT_LINK_POLICY, 0, NULL);
2568
if (hci_test_bit(HCI_INQUIRY, &di.flags))
2569
adapter->state |= STD_INQUIRY;
2571
adapter->state &= ~STD_INQUIRY;
2573
adapter_setup(adapter, dd);
2574
adapter_up(adapter, dd);
2578
info("Adapter %s has been enabled", adapter->path);
2583
static void reply_pending_requests(struct btd_adapter *adapter)
2590
/* pending bonding */
2591
if (adapter->bonding) {
2592
reply = new_authentication_return(adapter->bonding->msg,
2593
HCI_OE_USER_ENDED_CONNECTION);
2594
g_dbus_send_message(connection, reply);
2595
remove_pending_device(adapter);
2597
g_dbus_remove_watch(adapter->bonding->conn,
2598
adapter->bonding->listener_id);
2600
if (adapter->bonding->io_id)
2601
g_source_remove(adapter->bonding->io_id);
2602
if (adapter->bonding->io)
2603
g_io_channel_close(adapter->bonding->io);
2604
bonding_request_free(adapter->bonding);
2605
adapter->bonding = NULL;
2608
if (adapter->state & STD_INQUIRY) {
2609
/* Cancel inquiry initiated by D-Bus client */
2610
if (adapter->disc_sessions)
2611
cancel_discovery(adapter);
2614
if (adapter->state & PERIODIC_INQUIRY) {
2615
/* Stop periodic inquiry initiated by D-Bus client */
2616
if (adapter->disc_sessions)
2617
cancel_periodic_discovery(adapter);
2621
static void unload_drivers(struct btd_adapter *adapter)
2625
for (l = adapter_drivers; l; l = l->next) {
2626
struct btd_adapter_driver *driver = l->data;
2629
driver->remove(adapter);
2633
int adapter_stop(struct btd_adapter *adapter)
2635
const char *mode = "off";
2636
gboolean powered, discoverable;
2638
/* cancel pending timeout */
2639
if (adapter->discov_timeout_id) {
2640
g_source_remove(adapter->discov_timeout_id);
2641
adapter->discov_timeout_id = 0;
2644
/* check pending requests */
2645
reply_pending_requests(adapter);
2647
if (adapter->disc_sessions) {
2648
g_slist_foreach(adapter->disc_sessions, (GFunc) session_free,
2650
g_slist_free(adapter->disc_sessions);
2651
adapter->disc_sessions = NULL;
2654
if (adapter->found_devices) {
2655
g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL);
2656
g_slist_free(adapter->found_devices);
2657
adapter->found_devices = NULL;
2660
if (adapter->oor_devices) {
2661
g_slist_foreach(adapter->oor_devices, (GFunc) free, NULL);
2662
g_slist_free(adapter->oor_devices);
2663
adapter->oor_devices = NULL;
2666
if (adapter->auth_reqs) {
2667
g_slist_foreach(adapter->auth_reqs, (GFunc) g_free, NULL);
2668
g_slist_free(adapter->auth_reqs);
2669
adapter->auth_reqs = NULL;
2672
if (adapter->active_conn) {
2673
g_slist_foreach(adapter->active_conn, (GFunc) g_free, NULL);
2674
g_slist_free(adapter->active_conn);
2675
adapter->active_conn = NULL;
2678
dbus_connection_emit_property_changed(connection, adapter->path,
2679
ADAPTER_INTERFACE, "Mode",
2680
DBUS_TYPE_STRING, &mode);
2684
dbus_connection_emit_property_changed(connection, adapter->path,
2685
ADAPTER_INTERFACE, "Powered",
2686
DBUS_TYPE_BOOLEAN, &powered);
2688
if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY)) {
2689
discoverable = FALSE;
2691
dbus_connection_emit_property_changed(connection, adapter->path,
2692
ADAPTER_INTERFACE, "Discoverable",
2693
DBUS_TYPE_BOOLEAN, &discoverable);
2697
adapter->scan_mode = SCAN_DISABLED;
2698
adapter->mode = MODE_OFF;
2699
adapter->state = DISCOVER_TYPE_NONE;
2701
unload_drivers(adapter);
2703
info("Adapter %s has been disabled", adapter->path);
2708
int adapter_update(struct btd_adapter *adapter)
2710
struct hci_dev *dev = &adapter->dev;
2716
dd = hci_open_dev(adapter->dev_id);
2719
error("Can't open adapter %s: %s (%d)",
2720
adapter->path, strerror(err), err);
2724
update_ext_inquiry_response(dd, dev);
2731
int adapter_get_class(struct btd_adapter *adapter, uint8_t *cls)
2733
struct hci_dev *dev = &adapter->dev;
2735
memcpy(cls, dev->class, 3);
2740
int adapter_set_class(struct btd_adapter *adapter, uint8_t *cls)
2742
struct hci_dev *dev = &adapter->dev;
2744
memcpy(dev->class, cls, 3);
2749
int adapter_update_ssp_mode(struct btd_adapter *adapter, int dd, uint8_t mode)
2751
struct hci_dev *dev = &adapter->dev;
2753
dev->ssp_mode = mode;
2755
update_ext_inquiry_response(dd, dev);
2762
static void adapter_free(gpointer user_data)
2764
struct btd_adapter *adapter = user_data;
2766
agent_destroy(adapter->agent, FALSE);
2767
adapter->agent = NULL;
2769
g_free(adapter->path);
2775
struct btd_adapter *adapter_create(DBusConnection *conn, int id)
2777
char path[MAX_PATH_LENGTH];
2778
struct btd_adapter *adapter;
2783
snprintf(path, sizeof(path), "%s/hci%d", "/org/bluez", id);
2785
adapter = g_try_new0(struct btd_adapter, 1);
2787
error("Failed to alloc memory to D-Bus path register data (%s)",
2792
adapter->dev_id = id;
2793
adapter->state |= RESOLVE_NAME;
2794
adapter->path = g_strdup(path);
2796
if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2797
adapter_methods, adapter_signals, NULL,
2798
adapter, adapter_free)) {
2799
error("Adapter interface init failed on path %s", path);
2800
adapter_free(adapter);
2807
void adapter_remove(struct btd_adapter *adapter)
2810
char *path = g_strdup(adapter->path);
2812
debug("Removing adapter %s", path);
2814
for (l = adapter->devices; l; l = l->next)
2815
device_remove(connection, l->data);
2816
g_slist_free(adapter->devices);
2818
g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2823
uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2825
return adapter->dev_id;
2828
const gchar *adapter_get_path(struct btd_adapter *adapter)
2833
return adapter->path;
2836
void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2838
bacpy(bdaddr, &adapter->bdaddr);
2841
static gboolean discov_timeout_handler(void *data)
2843
struct btd_adapter *adapter = data;
2844
struct hci_request rq;
2846
uint8_t scan_enable = adapter->scan_mode;
2848
gboolean retval = TRUE;
2849
uint16_t dev_id = adapter->dev_id;
2851
scan_enable &= ~SCAN_INQUIRY;
2853
dd = hci_open_dev(dev_id);
2855
error("HCI device open failed: hci%d", dev_id);
2859
memset(&rq, 0, sizeof(rq));
2860
rq.ogf = OGF_HOST_CTL;
2861
rq.ocf = OCF_WRITE_SCAN_ENABLE;
2862
rq.cparam = &scan_enable;
2863
rq.clen = sizeof(scan_enable);
2864
rq.rparam = &status;
2865
rq.rlen = sizeof(status);
2866
rq.event = EVT_CMD_COMPLETE;
2868
if (hci_send_req(dd, &rq, HCI_REQ_TIMEOUT) < 0) {
2869
error("Sending write scan enable command to hci%d failed: %s (%d)",
2870
dev_id, strerror(errno), errno);
2874
error("Setting scan enable failed with status 0x%02x", status);
2878
set_limited_discoverable(dd, adapter->dev.class, FALSE);
2880
adapter_remove_discov_timeout(adapter);
2890
void adapter_set_discov_timeout(struct btd_adapter *adapter, guint interval)
2895
if (adapter->discov_timeout_id) {
2896
error("Timeout already added for adapter %s", adapter->path);
2900
adapter->discov_timeout_id = g_timeout_add(interval, discov_timeout_handler, adapter);
2903
void adapter_remove_discov_timeout(struct btd_adapter *adapter)
2908
if(adapter->discov_timeout_id == 0)
2911
g_source_remove(adapter->discov_timeout_id);
2912
adapter->discov_timeout_id = 0;
2915
void adapter_set_scan_mode(struct btd_adapter *adapter, uint8_t scan_mode)
2920
adapter->scan_mode = scan_mode;
2923
uint8_t adapter_get_scan_mode(struct btd_adapter *adapter)
2925
return adapter->scan_mode;
2928
void adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
2933
adapter->mode = mode;
2936
uint8_t adapter_get_mode(struct btd_adapter *adapter)
2938
return adapter->mode;
2941
void adapter_set_state(struct btd_adapter *adapter, int state)
2943
gboolean discov_active = FALSE;
2944
const char *path = adapter->path;
2946
if (adapter->state == state)
2949
if (state & PERIODIC_INQUIRY || state & STD_INQUIRY)
2950
discov_active = TRUE;
2951
else if (adapter->disc_sessions && main_opts.inqmode)
2952
adapter->scheduler_id = g_timeout_add(main_opts.inqmode * 1000,
2953
(GSourceFunc) start_inquiry, adapter);
2955
if (!discov_active && adapter->found_devices) {
2956
g_slist_foreach(adapter->found_devices, (GFunc) g_free, NULL);
2957
g_slist_free(adapter->found_devices);
2958
adapter->found_devices = NULL;
2961
if (!discov_active && adapter->oor_devices) {
2962
g_slist_foreach(adapter->oor_devices, (GFunc) g_free, NULL);
2963
g_slist_free(adapter->oor_devices);
2964
adapter->oor_devices = NULL;
2967
dbus_connection_emit_property_changed(connection, path,
2968
ADAPTER_INTERFACE, "Discovering",
2969
DBUS_TYPE_BOOLEAN, &discov_active);
2971
adapter->state = state;
2974
int adapter_get_state(struct btd_adapter *adapter)
2976
return adapter->state;
2979
struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
2980
struct remote_dev_info *match)
2984
l = g_slist_find_custom(adapter->found_devices, match,
2985
(GCompareFunc) found_device_cmp);
2992
int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
2996
rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
2997
rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
2999
return rssi1 - rssi2;
3002
int adapter_add_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3003
int8_t rssi, name_status_t name_status)
3005
struct remote_dev_info *dev, match;
3007
memset(&match, 0, sizeof(struct remote_dev_info));
3008
bacpy(&match.bdaddr, bdaddr);
3009
match.name_status = NAME_ANY;
3011
/* ignore repeated entries */
3012
dev = adapter_search_found_devices(adapter, &match);
3014
/* device found, update the attributes */
3018
/* Get remote name can be received while inquiring.
3019
* Keep in mind that multiple inquiry result events can
3020
* be received from the same remote device.
3022
if (name_status != NAME_NOT_REQUIRED)
3023
dev->name_status = name_status;
3025
adapter->found_devices = g_slist_sort(adapter->found_devices,
3026
(GCompareFunc) dev_rssi_cmp);
3031
dev = g_new0(struct remote_dev_info, 1);
3033
bacpy(&dev->bdaddr, bdaddr);
3035
dev->name_status = name_status;
3037
adapter->found_devices = g_slist_insert_sorted(adapter->found_devices,
3038
dev, (GCompareFunc) dev_rssi_cmp);
3043
int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3045
struct remote_dev_info *dev, match;
3047
memset(&match, 0, sizeof(struct remote_dev_info));
3048
bacpy(&match.bdaddr, bdaddr);
3050
dev = adapter_search_found_devices(adapter, &match);
3054
adapter->found_devices = g_slist_remove(adapter->found_devices, dev);
3060
void adapter_update_oor_devices(struct btd_adapter *adapter)
3062
GSList *l = adapter->found_devices;
3063
struct remote_dev_info *dev;
3066
send_out_of_range(adapter->path, adapter->oor_devices);
3068
g_slist_foreach(adapter->oor_devices, (GFunc) free, NULL);
3069
g_slist_free(adapter->oor_devices);
3070
adapter->oor_devices = NULL;
3074
baswap(&tmp, &dev->bdaddr);
3075
adapter->oor_devices = g_slist_append(adapter->oor_devices,
3081
void adapter_remove_oor_device(struct btd_adapter *adapter, char *peer_addr)
3085
l = g_slist_find_custom(adapter->oor_devices, peer_addr,
3086
(GCompareFunc) strcmp);
3088
char *dev = l->data;
3089
adapter->oor_devices = g_slist_remove(adapter->oor_devices,
3095
void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
3097
const gchar *path = adapter_get_path(adapter);
3099
gboolean powered, discoverable;
3101
switch (scan_mode) {
3104
adapter_set_mode(adapter, MODE_OFF);
3106
discoverable = FALSE;
3109
mode = "connectable";
3110
adapter_set_mode(adapter, MODE_CONNECTABLE);
3112
discoverable = FALSE;
3114
case (SCAN_PAGE | SCAN_INQUIRY):
3116
discoverable = TRUE;
3117
if (adapter_get_mode(adapter) == MODE_LIMITED) {
3120
adapter_set_mode(adapter, MODE_DISCOVERABLE);
3121
mode = "discoverable";
3123
if (adapter->discov_timeout != 0)
3124
adapter_set_discov_timeout(adapter,
3125
adapter->discov_timeout * 1000);
3128
/* Address the scenario where a low-level application like
3129
* hciconfig changed the scan mode */
3130
if (adapter->discov_timeout != 0)
3131
adapter_set_discov_timeout(adapter,
3132
adapter->discov_timeout * 1000);
3134
/* ignore, this event should not be sent */
3136
/* ignore, reserved */
3140
dbus_connection_emit_property_changed(connection, path,
3141
ADAPTER_INTERFACE, "Mode",
3142
DBUS_TYPE_STRING, &mode);
3144
if (powered == FALSE || adapter->scan_mode == SCAN_DISABLED) {
3145
dbus_connection_emit_property_changed(connection, path,
3146
ADAPTER_INTERFACE, "Powered",
3147
DBUS_TYPE_BOOLEAN, &powered);
3150
dbus_connection_emit_property_changed(connection, path,
3151
ADAPTER_INTERFACE, "Discoverable",
3152
DBUS_TYPE_BOOLEAN, &discoverable);
3154
adapter_set_scan_mode(adapter, scan_mode);
3157
struct agent *adapter_get_agent(struct btd_adapter *adapter)
3159
if (!adapter || !adapter->agent)
3162
return adapter->agent;
3165
void adapter_add_active_conn(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3168
struct active_conn_info *dev;
3173
dev = g_new0(struct active_conn_info, 1);
3175
bacpy(&dev->bdaddr, bdaddr);
3176
dev->handle = handle;
3178
adapter->active_conn = g_slist_append(adapter->active_conn, dev);
3181
void adapter_remove_active_conn(struct btd_adapter *adapter,
3182
struct active_conn_info *dev)
3184
if (!adapter || !adapter->active_conn)
3187
adapter->active_conn = g_slist_remove(adapter->active_conn, dev);
3191
struct active_conn_info *adapter_search_active_conn_by_bdaddr(struct btd_adapter *adapter,
3196
if (!adapter || !adapter->active_conn)
3199
l = g_slist_find_custom(adapter->active_conn, &bda,
3200
active_conn_find_by_bdaddr);
3207
struct active_conn_info *adapter_search_active_conn_by_handle(struct btd_adapter *adapter,
3212
if (!adapter || !adapter->active_conn)
3215
l = g_slist_find_custom(adapter->active_conn, &handle,
3216
active_conn_find_by_handle);
3223
void adapter_free_bonding_request(struct btd_adapter *adapter)
3225
g_dbus_remove_watch(connection, adapter->bonding->listener_id);
3227
if (adapter->bonding->io_id)
3228
g_source_remove(adapter->bonding->io_id);
3230
if (adapter->bonding->io)
3231
g_io_channel_close(adapter->bonding->io);
3233
bonding_request_free(adapter->bonding);
3235
adapter->bonding = NULL;
3238
struct bonding_request_info *adapter_get_bonding_info(struct btd_adapter *adapter)
3243
return adapter->bonding;
3246
gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
3248
if (!adapter || !adapter->disc_sessions)
3254
int btd_register_adapter_driver(struct btd_adapter_driver *driver)
3256
adapter_drivers = g_slist_append(adapter_drivers, driver);
3261
void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
3263
adapter_drivers = g_slist_remove(adapter_drivers, driver);
3266
static void agent_auth_cb(struct agent *agent, DBusError *derr, void *user_data)
3268
struct service_auth *auth = user_data;
3270
auth->cb(derr, auth->user_data);
3275
int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3276
const char *uuid, service_auth_cb cb, void *user_data)
3278
struct service_auth *auth;
3279
struct btd_adapter *adapter;
3280
struct btd_device *device;
3281
struct agent *agent;
3284
const gchar *dev_path;
3286
if (src == NULL || dst == NULL)
3289
adapter = manager_find_adapter(src);
3293
/* Device connected? */
3294
if (!g_slist_find_custom(adapter->active_conn,
3295
dst, active_conn_find_by_bdaddr))
3298
ba2str(dst, address);
3299
trusted = read_trust(src, address, GLOBAL_TRUST);
3302
cb(NULL, user_data);
3306
device = adapter_find_device(adapter, address);
3310
agent = device_get_agent(device);
3313
agent = adapter->agent;
3318
auth = g_try_new0(struct service_auth, 1);
3323
auth->user_data = user_data;
3325
dev_path = device_get_path(device);
3327
return agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth);
3330
int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3332
struct btd_adapter *adapter = manager_find_adapter(src);
3333
struct btd_device *device;
3334
struct agent *agent;
3340
ba2str(dst, address);
3341
device = adapter_find_device(adapter, address);
3346
* FIXME: Cancel fails if authorization is requested to adapter's
3347
* agent and in the meanwhile CreatePairedDevice is called.
3350
agent = device_get_agent(device);
3353
agent = adapter->agent;
3358
return agent_cancel(agent);
3361
void adapter_update_devices(struct btd_adapter *adapter)
3368
devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
3369
for (i = 0, l = adapter->devices; l; l = l->next, i++) {
3370
struct btd_device *dev = l->data;
3371
devices[i] = (char *) device_get_path(dev);
3374
dbus_connection_emit_property_changed(connection, adapter->path,
3375
ADAPTER_INTERFACE, "Devices",
3376
DBUS_TYPE_ARRAY, &devices);