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"
56 #include "glib-helper.h"
59 #include "attrib-server.h"
62 /* Flags Descriptions */
63 #define EIR_LIM_DISC 0x01 /* LE Limited Discoverable Mode */
64 #define EIR_GEN_DISC 0x02 /* LE General Discoverable Mode */
65 #define EIR_BREDR_UNSUP 0x04 /* BR/EDR Not Supported */
66 #define EIR_SIM_CONTROLLER 0x08 /* Simultaneous LE and BR/EDR to Same
67 Device Capable (Controller) */
68 #define EIR_SIM_HOST 0x10 /* Simultaneous LE and BR/EDR to Same
69 Device Capable (Host) */
71 #define ADV_TYPE_IND 0x00
72 #define ADV_TYPE_DIRECT_IND 0x01
74 #define IO_CAPABILITY_DISPLAYONLY 0x00
75 #define IO_CAPABILITY_DISPLAYYESNO 0x01
76 #define IO_CAPABILITY_KEYBOARDONLY 0x02
77 #define IO_CAPABILITY_NOINPUTNOOUTPUT 0x03
78 #define IO_CAPABILITY_INVALID 0xFF
80 /* Limited Discoverable bit mask in CoD */
81 #define LIMITED_BIT 0x002000
82 #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 guint discov_timeout_id; /* discoverable timeout id */
116 guint stop_discov_id; /* stop inquiry/scanning id */
117 uint32_t discov_timeout; /* discoverable time(sec) */
118 guint pairable_timeout_id; /* pairable timeout id */
119 uint32_t pairable_timeout; /* pairable time(sec) */
120 uint8_t scan_mode; /* scan mode: SCAN_DISABLED, SCAN_PAGE,
122 #ifdef __TIZEN_PATCH__
123 // Adding Limited state for setting limited discoverable mode
124 gboolean limited; /* limited discoverable state */
126 uint8_t mode; /* off, connectable, discoverable,
128 uint8_t global_mode; /* last valid global mode */
129 struct session_req *pending_mode;
130 int state; /* standard inq, periodic inq, name
131 * resolving, suspended discovery */
132 GSList *found_devices;
133 GSList *oor_devices; /* out of range device list */
134 struct agent *agent; /* For the new API */
135 guint auth_idle_id; /* Ongoing authorization */
136 GSList *connections; /* Connected devices */
137 GSList *devices; /* Devices structure pointers */
138 GSList *mode_sessions; /* Request Mode sessions */
139 GSList *disc_sessions; /* Discovery sessions */
140 guint scheduler_id; /* Scheduler handle */
141 sdp_list_t *services; /* Services associated to adapter */
143 struct hci_dev dev; /* hci info */
144 gboolean pairable; /* pairable state */
145 gboolean initialized;
147 gboolean off_requested; /* DEVDOWN ioctl was called */
151 GSList *powered_callbacks;
153 gboolean name_stored;
155 GSList *loaded_drivers;
158 static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
161 static int found_device_cmp(const struct remote_dev_info *d1,
162 const struct remote_dev_info *d2)
166 if (bacmp(&d2->bdaddr, BDADDR_ANY)) {
167 ret = bacmp(&d1->bdaddr, &d2->bdaddr);
172 if (d2->name_status != NAME_ANY) {
173 ret = (d1->name_status - d2->name_status);
181 static void dev_info_free(struct remote_dev_info *dev)
185 g_slist_foreach(dev->services, (GFunc) g_free, NULL);
186 g_slist_free(dev->services);
187 g_strfreev(dev->uuids);
192 * Device name expansion
195 static char *expand_name(char *dst, int size, char *str, int dev_id)
197 register int sp, np, olen;
204 while (np < size - 1 && str[sp]) {
211 sprintf(buf, "%d", dev_id);
216 opt = main_opts.host_name;
220 dst[np++] = str[sp++];
230 if (np + olen < size - 1)
231 memcpy(dst + np, opt, olen);
241 dst[np++] = str[sp++];
249 int btd_adapter_set_class(struct btd_adapter *adapter, uint8_t major,
252 return adapter_ops->set_dev_class(adapter->dev_id, major, minor);
255 static int pending_remote_name_cancel(struct btd_adapter *adapter)
257 struct remote_dev_info *dev, match;
260 /* find the pending remote name request */
261 memset(&match, 0, sizeof(struct remote_dev_info));
262 bacpy(&match.bdaddr, BDADDR_ANY);
263 match.name_status = NAME_REQUESTED;
265 dev = adapter_search_found_devices(adapter, &match);
266 if (!dev) /* no pending request */
269 err = adapter_ops->cancel_resolve_name(adapter->dev_id, &dev->bdaddr);
271 error("Remote name cancel failed: %s(%d)",
272 strerror(errno), errno);
276 int adapter_resolve_names(struct btd_adapter *adapter)
278 struct remote_dev_info *dev, match;
281 /* Do not attempt to resolve more names if on suspended state */
282 if (adapter->state & STATE_SUSPENDED)
285 memset(&match, 0, sizeof(struct remote_dev_info));
286 bacpy(&match.bdaddr, BDADDR_ANY);
287 match.name_status = NAME_REQUIRED;
289 dev = adapter_search_found_devices(adapter, &match);
293 /* send at least one request or return failed if the list is empty */
295 /* flag to indicate the current remote name requested */
296 dev->name_status = NAME_REQUESTED;
298 err = adapter_ops->resolve_name(adapter->dev_id, &dev->bdaddr);
303 error("Unable to send HCI remote name req: %s (%d)",
304 strerror(errno), errno);
306 /* if failed, request the next element */
307 /* remove the element from the list */
308 adapter_remove_found_device(adapter, &dev->bdaddr);
310 /* get the next element */
311 dev = adapter_search_found_devices(adapter, &match);
317 static const char *mode2str(uint8_t mode)
322 case MODE_CONNECTABLE:
323 return "connectable";
324 case MODE_DISCOVERABLE:
325 return "discoverable";
331 static uint8_t get_mode(const bdaddr_t *bdaddr, const char *mode)
333 if (strcasecmp("off", mode) == 0)
335 else if (strcasecmp("connectable", mode) == 0)
336 return MODE_CONNECTABLE;
337 else if (strcasecmp("discoverable", mode) == 0)
338 return MODE_DISCOVERABLE;
339 else if (strcasecmp("on", mode) == 0) {
340 char onmode[14], srcaddr[18];
342 ba2str(bdaddr, srcaddr);
343 if (read_on_mode(srcaddr, onmode, sizeof(onmode)) < 0)
344 return MODE_CONNECTABLE;
346 return get_mode(bdaddr, onmode);
351 static void adapter_set_limited_discoverable(struct btd_adapter *adapter,
354 DBG("%s", limited ? "TRUE" : "FALSE");
356 adapter_ops->set_limited_discoverable(adapter->dev_id, limited);
359 static void adapter_remove_discov_timeout(struct btd_adapter *adapter)
364 if (adapter->discov_timeout_id == 0)
367 g_source_remove(adapter->discov_timeout_id);
368 adapter->discov_timeout_id = 0;
371 static gboolean discov_timeout_handler(gpointer user_data)
373 struct btd_adapter *adapter = user_data;
375 adapter->discov_timeout_id = 0;
377 adapter_ops->set_discoverable(adapter->dev_id, FALSE);
382 static void adapter_set_discov_timeout(struct btd_adapter *adapter,
385 if (adapter->discov_timeout_id) {
386 g_source_remove(adapter->discov_timeout_id);
387 adapter->discov_timeout_id = 0;
391 adapter_set_limited_discoverable(adapter, FALSE);
395 /* Set limited discoverable if pairable and interval between 0 to 60
397 if (adapter->pairable && interval <= 60)
398 adapter_set_limited_discoverable(adapter, TRUE);
400 adapter_set_limited_discoverable(adapter, FALSE);
402 adapter->discov_timeout_id = g_timeout_add_seconds(interval,
403 discov_timeout_handler,
407 static struct session_req *session_ref(struct session_req *req)
411 DBG("%p: ref=%d", req, req->refcount);
416 static struct session_req *create_session(struct btd_adapter *adapter,
417 DBusConnection *conn, DBusMessage *msg,
418 uint8_t mode, GDBusWatchFunction cb)
420 const char *sender = dbus_message_get_sender(msg);
421 struct session_req *req;
423 req = g_new0(struct session_req, 1);
424 req->adapter = adapter;
425 req->conn = dbus_connection_ref(conn);
426 req->msg = dbus_message_ref(msg);
430 return session_ref(req);
432 req->owner = g_strdup(sender);
433 req->id = g_dbus_add_disconnect_watch(conn, sender, cb, req, NULL);
435 info("%s session %p with %s activated",
436 req->mode ? "Mode" : "Discovery", req, sender);
438 return session_ref(req);
441 static int adapter_set_mode(struct btd_adapter *adapter, uint8_t mode)
445 if (mode == MODE_CONNECTABLE)
446 err = adapter_ops->set_discoverable(adapter->dev_id, FALSE);
448 err = adapter_ops->set_discoverable(adapter->dev_id, TRUE);
453 if (mode == MODE_CONNECTABLE)
456 adapter_remove_discov_timeout(adapter);
458 if (adapter->discov_timeout)
459 adapter_set_discov_timeout(adapter, adapter->discov_timeout);
464 static struct session_req *find_session_by_msg(GSList *list, const DBusMessage *msg)
468 for (l = list; l; l = l->next) {
469 struct session_req *req = l->data;
478 static int set_mode(struct btd_adapter *adapter, uint8_t new_mode,
483 gboolean discoverable;
485 if (adapter->pending_mode != NULL)
488 discoverable = new_mode == MODE_DISCOVERABLE;
490 if (!adapter->up && new_mode != MODE_OFF) {
491 err = adapter_ops->set_powered(adapter->dev_id, TRUE);
498 if (adapter->up && new_mode == MODE_OFF) {
499 err = adapter_ops->set_powered(adapter->dev_id, FALSE);
503 adapter->off_requested = TRUE;
508 if (new_mode == adapter->mode)
511 err = adapter_set_mode(adapter, new_mode);
517 modestr = mode2str(new_mode);
518 write_device_mode(&adapter->bdaddr, modestr);
523 struct session_req *req;
525 req = find_session_by_msg(adapter->mode_sessions, msg);
527 adapter->pending_mode = req;
530 /* Wait for mode change to reply */
531 adapter->pending_mode = create_session(adapter,
532 connection, msg, new_mode, NULL);
534 /* Nothing to reply just write the new mode */
535 adapter->mode = new_mode;
540 static DBusMessage *set_discoverable(DBusConnection *conn, DBusMessage *msg,
541 gboolean discoverable, void *data)
543 struct btd_adapter *adapter = data;
547 mode = discoverable ? MODE_DISCOVERABLE : MODE_CONNECTABLE;
549 if (mode == adapter->mode) {
550 adapter->global_mode = mode;
551 return dbus_message_new_method_return(msg);
554 err = set_mode(adapter, mode, msg);
556 return btd_error_failed(msg, strerror(-err));
561 static DBusMessage *set_powered(DBusConnection *conn, DBusMessage *msg,
562 gboolean powered, void *data)
564 struct btd_adapter *adapter = data;
568 #ifdef __TIZEN_PATCH__
571 mode = adapter->mode ? adapter->mode : get_mode(&adapter->bdaddr, "on");
577 mode = powered ? get_mode(&adapter->bdaddr, "on") : MODE_OFF;
580 if (mode == adapter->mode) {
581 adapter->global_mode = mode;
582 return dbus_message_new_method_return(msg);
585 err = set_mode(adapter, mode, msg);
587 return btd_error_failed(msg, strerror(-err));
592 void btd_adapter_pairable_changed(struct btd_adapter *adapter,
595 adapter->pairable = pairable;
597 write_device_pairable(&adapter->bdaddr, pairable);
599 emit_property_changed(connection, adapter->path,
600 ADAPTER_INTERFACE, "Pairable",
601 DBUS_TYPE_BOOLEAN, &pairable);
603 if (pairable && adapter->pairable_timeout)
604 adapter_set_pairable_timeout(adapter,
605 adapter->pairable_timeout);
608 static DBusMessage *set_pairable(DBusConnection *conn, DBusMessage *msg,
609 gboolean pairable, void *data)
611 struct btd_adapter *adapter = data;
614 if (adapter->scan_mode == SCAN_DISABLED)
615 return btd_error_not_ready(msg);
617 if (pairable == adapter->pairable)
620 if (!(adapter->scan_mode & SCAN_INQUIRY))
623 #ifndef __TIZEN_PATCH__
624 err = set_mode(adapter, MODE_DISCOVERABLE, NULL);
626 return btd_error_failed(msg, strerror(-err));
630 adapter_ops->set_pairable(adapter->dev_id, pairable);
633 return msg ? dbus_message_new_method_return(msg) : NULL;
636 static gboolean pairable_timeout_handler(void *data)
638 set_pairable(NULL, NULL, FALSE, data);
643 static void adapter_set_pairable_timeout(struct btd_adapter *adapter,
646 if (adapter->pairable_timeout_id) {
647 g_source_remove(adapter->pairable_timeout_id);
648 adapter->pairable_timeout_id = 0;
654 adapter->pairable_timeout_id = g_timeout_add_seconds(interval,
655 pairable_timeout_handler,
659 static struct session_req *find_session(GSList *list, const char *sender)
663 for (l = list; l; l = l->next) {
664 struct session_req *req = l->data;
666 if (g_str_equal(req->owner, sender))
673 static uint8_t get_needed_mode(struct btd_adapter *adapter, uint8_t mode)
677 if (adapter->global_mode > mode)
678 mode = adapter->global_mode;
680 for (l = adapter->mode_sessions; l; l = l->next) {
681 struct session_req *req = l->data;
683 if (req->mode > mode)
690 static GSList *remove_bredr(GSList *all)
694 for (l = all, le = NULL; l; l = l->next) {
695 struct remote_dev_info *dev = l->data;
696 if (dev->le == FALSE) {
701 le = g_slist_append(le, dev);
709 static void stop_discovery(struct btd_adapter *adapter, gboolean suspend)
711 pending_remote_name_cancel(adapter);
713 if (suspend == FALSE)
714 adapter->found_devices = remove_bredr(adapter->found_devices);
716 if (adapter->oor_devices) {
717 g_slist_free(adapter->oor_devices);
718 adapter->oor_devices = NULL;
721 /* Reset if suspended, otherwise remove timer (software scheduler)
722 or request inquiry to stop */
723 if (adapter->state & STATE_SUSPENDED) {
724 adapter->state &= ~STATE_SUSPENDED;
728 if (adapter->scheduler_id) {
729 g_source_remove(adapter->scheduler_id);
730 adapter->scheduler_id = 0;
734 if (adapter->state & STATE_LE_SCAN)
735 adapter_ops->stop_scanning(adapter->dev_id);
737 adapter_ops->stop_inquiry(adapter->dev_id);
740 static void session_remove(struct session_req *req)
742 struct btd_adapter *adapter = req->adapter;
744 /* Ignore set_mode session */
745 if (req->owner == NULL)
748 DBG("%s session %p with %s deactivated",
749 req->mode ? "Mode" : "Discovery", req, req->owner);
754 adapter->mode_sessions = g_slist_remove(adapter->mode_sessions,
757 mode = get_needed_mode(adapter, adapter->global_mode);
759 if (mode == adapter->mode)
762 DBG("Switching to '%s' mode", mode2str(mode));
764 set_mode(adapter, mode, NULL);
766 adapter->disc_sessions = g_slist_remove(adapter->disc_sessions,
769 if (adapter->disc_sessions)
772 DBG("Stopping discovery");
774 stop_discovery(adapter, FALSE);
778 static void session_free(struct session_req *req)
781 g_dbus_remove_watch(req->conn, req->id);
786 dbus_message_unref(req->msg);
787 if (!req->got_reply && req->mode && req->adapter->agent)
788 agent_cancel(req->adapter->agent);
792 dbus_connection_unref(req->conn);
797 static void session_owner_exit(DBusConnection *conn, void *user_data)
799 struct session_req *req = user_data;
806 static void session_unref(struct session_req *req)
810 DBG("%p: ref=%d", req, req->refcount);
818 static void confirm_mode_cb(struct agent *agent, DBusError *derr, void *data)
820 struct session_req *req = data;
824 req->got_reply = TRUE;
826 if (derr && dbus_error_is_set(derr)) {
827 reply = dbus_message_new_error(req->msg, derr->name,
829 g_dbus_send_message(req->conn, reply);
834 err = set_mode(req->adapter, req->mode, req->msg);
836 reply = btd_error_failed(req->msg, strerror(-err));
837 else if (!req->adapter->pending_mode)
838 reply = dbus_message_new_method_return(req->msg);
844 * Send reply immediately only if there was an error changing
845 * mode, or change is not needed. Otherwise, reply is sent in
848 g_dbus_send_message(req->conn, reply);
850 dbus_message_unref(req->msg);
854 if (!find_session(req->adapter->mode_sessions, req->owner))
858 static DBusMessage *set_discoverable_timeout(DBusConnection *conn,
863 struct btd_adapter *adapter = data;
866 if (adapter->discov_timeout == timeout && timeout == 0)
867 return dbus_message_new_method_return(msg);
869 if (adapter->scan_mode & SCAN_INQUIRY)
870 adapter_set_discov_timeout(adapter, timeout);
872 adapter->discov_timeout = timeout;
874 write_discoverable_timeout(&adapter->bdaddr, timeout);
876 path = dbus_message_get_path(msg);
878 emit_property_changed(conn, path,
879 ADAPTER_INTERFACE, "DiscoverableTimeout",
880 DBUS_TYPE_UINT32, &timeout);
882 return dbus_message_new_method_return(msg);
885 static DBusMessage *set_pairable_timeout(DBusConnection *conn,
890 struct btd_adapter *adapter = data;
893 if (adapter->pairable_timeout == timeout && timeout == 0)
894 return dbus_message_new_method_return(msg);
896 if (adapter->pairable)
897 adapter_set_pairable_timeout(adapter, timeout);
899 adapter->pairable_timeout = timeout;
901 write_pairable_timeout(&adapter->bdaddr, timeout);
903 path = dbus_message_get_path(msg);
905 emit_property_changed(conn, path,
906 ADAPTER_INTERFACE, "PairableTimeout",
907 DBUS_TYPE_UINT32, &timeout);
909 return dbus_message_new_method_return(msg);
912 void btd_adapter_class_changed(struct btd_adapter *adapter, uint32_t new_class)
916 class[2] = (new_class >> 16) & 0xff;
917 class[1] = (new_class >> 8) & 0xff;
918 class[0] = new_class & 0xff;
920 write_local_class(&adapter->bdaddr, class);
922 adapter->dev_class = new_class;
924 if (main_opts.attrib_server) {
925 /* Removes service class */
926 class[1] = class[1] & 0x1f;
927 attrib_gap_set(GATT_CHARAC_APPEARANCE, class, 2);
930 emit_property_changed(connection, adapter->path,
931 ADAPTER_INTERFACE, "Class",
932 DBUS_TYPE_UINT32, &new_class);
935 void adapter_update_local_name(struct btd_adapter *adapter, const char *name)
937 struct hci_dev *dev = &adapter->dev;
939 if (strncmp(name, dev->name, MAX_NAME_LENGTH) == 0)
942 strncpy(dev->name, name, MAX_NAME_LENGTH);
944 if (main_opts.attrib_server)
945 attrib_gap_set(GATT_CHARAC_DEVICE_NAME,
946 (const uint8_t *) dev->name, strlen(dev->name));
948 if (!adapter->name_stored) {
949 char *name_ptr = dev->name;
951 write_local_name(&adapter->bdaddr, dev->name);
954 emit_property_changed(connection, adapter->path,
955 ADAPTER_INTERFACE, "Name",
956 DBUS_TYPE_STRING, &name_ptr);
959 adapter->name_stored = FALSE;
962 static DBusMessage *set_name(DBusConnection *conn, DBusMessage *msg,
963 const char *name, void *data)
965 struct btd_adapter *adapter = data;
966 struct hci_dev *dev = &adapter->dev;
967 char *name_ptr = dev->name;
969 if (!g_utf8_validate(name, -1, NULL)) {
970 error("Name change failed: supplied name isn't valid UTF-8");
971 return btd_error_invalid_args(msg);
974 if (strncmp(name, dev->name, MAX_NAME_LENGTH) == 0)
977 strncpy(dev->name, name, MAX_NAME_LENGTH);
978 write_local_name(&adapter->bdaddr, name);
979 emit_property_changed(connection, adapter->path,
980 ADAPTER_INTERFACE, "Name",
981 DBUS_TYPE_STRING, &name_ptr);
984 int err = adapter_ops->set_name(adapter->dev_id, name);
986 return btd_error_failed(msg, strerror(-err));
988 adapter->name_stored = TRUE;
992 return dbus_message_new_method_return(msg);
995 struct btd_device *adapter_find_device(struct btd_adapter *adapter,
998 struct btd_device *device;
1004 l = g_slist_find_custom(adapter->devices, dest,
1005 (GCompareFunc) device_address_cmp);
1014 static void adapter_update_devices(struct btd_adapter *adapter)
1021 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1022 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1023 struct btd_device *dev = l->data;
1024 devices[i] = (char *) device_get_path(dev);
1027 emit_array_property_changed(connection, adapter->path,
1028 ADAPTER_INTERFACE, "Devices",
1029 DBUS_TYPE_OBJECT_PATH, &devices, i);
1033 static void adapter_emit_uuids_updated(struct btd_adapter *adapter)
1039 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
1041 for (i = 0, list = adapter->services; list; list = list->next) {
1043 sdp_record_t *rec = list->data;
1045 uuid = bt_uuid2string(&rec->svclass);
1050 emit_array_property_changed(connection, adapter->path,
1051 ADAPTER_INTERFACE, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
1056 static uint8_t get_uuid_mask(uuid_t *uuid)
1058 if (uuid->type != SDP_UUID16)
1061 switch (uuid->value.uuid16) {
1062 case DIALUP_NET_SVCLASS_ID:
1063 case CIP_SVCLASS_ID:
1064 return 0x42; /* Telephony & Networking */
1065 case IRMC_SYNC_SVCLASS_ID:
1066 case OBEX_OBJPUSH_SVCLASS_ID:
1067 case OBEX_FILETRANS_SVCLASS_ID:
1068 case IRMC_SYNC_CMD_SVCLASS_ID:
1069 case PBAP_PSE_SVCLASS_ID:
1070 return 0x10; /* Object Transfer */
1071 case HEADSET_SVCLASS_ID:
1072 case HANDSFREE_SVCLASS_ID:
1073 return 0x20; /* Audio */
1074 case CORDLESS_TELEPHONY_SVCLASS_ID:
1075 case INTERCOM_SVCLASS_ID:
1076 case FAX_SVCLASS_ID:
1077 case SAP_SVCLASS_ID:
1079 * Setting the telephony bit for the handsfree audio gateway
1080 * role is not required by the HFP specification, but the
1081 * Nokia 616 carkit is just plain broken! It will refuse
1082 * pairing without this bit set.
1084 case HANDSFREE_AGW_SVCLASS_ID:
1085 return 0x40; /* Telephony */
1086 case AUDIO_SOURCE_SVCLASS_ID:
1087 case VIDEO_SOURCE_SVCLASS_ID:
1088 return 0x08; /* Capturing */
1089 case AUDIO_SINK_SVCLASS_ID:
1090 case VIDEO_SINK_SVCLASS_ID:
1091 return 0x04; /* Rendering */
1092 case PANU_SVCLASS_ID:
1093 case NAP_SVCLASS_ID:
1095 return 0x02; /* Networking */
1101 static int uuid_cmp(const void *a, const void *b)
1103 const sdp_record_t *rec = a;
1104 const uuid_t *uuid = b;
1106 return sdp_uuid_cmp(&rec->svclass, uuid);
1109 void adapter_service_insert(struct btd_adapter *adapter, void *r)
1111 sdp_record_t *rec = r;
1114 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1119 adapter->services = sdp_list_insert_sorted(adapter->services, rec,
1123 uint8_t svc_hint = get_uuid_mask(&rec->svclass);
1124 adapter_ops->add_uuid(adapter->dev_id, &rec->svclass, svc_hint);
1127 adapter_emit_uuids_updated(adapter);
1130 void adapter_service_remove(struct btd_adapter *adapter, void *r)
1132 sdp_record_t *rec = r;
1134 adapter->services = sdp_list_remove(adapter->services, rec);
1136 if (sdp_list_find(adapter->services, &rec->svclass, uuid_cmp) == NULL)
1137 adapter_ops->remove_uuid(adapter->dev_id, &rec->svclass);
1139 adapter_emit_uuids_updated(adapter);
1141 #ifdef __TIZEN_PATCH__
1142 sdp_list_t *adapter_get_services(struct btd_adapter *adapter)
1144 return adapter->services;
1148 static struct btd_device *adapter_create_device(DBusConnection *conn,
1149 struct btd_adapter *adapter,
1150 const char *address,
1153 struct btd_device *device;
1158 device = device_create(conn, adapter, address, type);
1162 device_set_temporary(device, TRUE);
1164 adapter->devices = g_slist_append(adapter->devices, device);
1166 path = device_get_path(device);
1167 g_dbus_emit_signal(conn, adapter->path,
1168 ADAPTER_INTERFACE, "DeviceCreated",
1169 DBUS_TYPE_OBJECT_PATH, &path,
1172 adapter_update_devices(adapter);
1177 void adapter_remove_device(DBusConnection *conn, struct btd_adapter *adapter,
1178 struct btd_device *device,
1179 gboolean remove_storage)
1181 const gchar *dev_path = device_get_path(device);
1182 struct agent *agent;
1184 adapter->devices = g_slist_remove(adapter->devices, device);
1185 adapter->connections = g_slist_remove(adapter->connections, device);
1187 adapter_update_devices(adapter);
1189 g_dbus_emit_signal(conn, adapter->path,
1190 ADAPTER_INTERFACE, "DeviceRemoved",
1191 DBUS_TYPE_OBJECT_PATH, &dev_path,
1194 agent = device_get_agent(device);
1196 if (agent && device_is_authorizing(device))
1197 agent_cancel(agent);
1199 device_remove(device, remove_storage);
1202 struct btd_device *adapter_get_device(DBusConnection *conn,
1203 struct btd_adapter *adapter,
1204 const gchar *address)
1206 struct btd_device *device;
1213 device = adapter_find_device(adapter, address);
1217 return adapter_create_device(conn, adapter, address,
1221 static gboolean stop_scanning(gpointer user_data)
1223 struct btd_adapter *adapter = user_data;
1225 adapter_ops->stop_scanning(adapter->dev_id);
1230 static int start_discovery(struct btd_adapter *adapter)
1234 /* Do not start if suspended */
1235 if (adapter->state & STATE_SUSPENDED)
1238 /* Postpone discovery if still resolving names */
1239 if (adapter->state & STATE_RESOLVNAME)
1242 pending_remote_name_cancel(adapter);
1244 type = adapter_get_discover_type(adapter) & ~DISC_RESOLVNAME;
1248 case DISC_INTERLEAVE:
1249 err = adapter_ops->start_inquiry(adapter->dev_id,
1253 err = adapter_ops->start_inquiry(adapter->dev_id,
1257 err = adapter_ops->start_scanning(adapter->dev_id);
1266 static DBusMessage *adapter_start_discovery(DBusConnection *conn,
1267 DBusMessage *msg, void *data)
1269 struct session_req *req;
1270 struct btd_adapter *adapter = data;
1271 const char *sender = dbus_message_get_sender(msg);
1273 info("adapter_start_discovery");
1275 return btd_error_not_ready(msg);
1277 req = find_session(adapter->disc_sessions, sender);
1280 return dbus_message_new_method_return(msg);
1283 if (adapter->disc_sessions)
1286 g_slist_foreach(adapter->found_devices, (GFunc) dev_info_free, NULL);
1287 g_slist_free(adapter->found_devices);
1288 adapter->found_devices = NULL;
1290 g_slist_free(adapter->oor_devices);
1291 adapter->oor_devices = NULL;
1293 err = start_discovery(adapter);
1295 return btd_error_failed(msg, strerror(-err));
1298 req = create_session(adapter, conn, msg, 0,
1299 session_owner_exit);
1301 adapter->disc_sessions = g_slist_append(adapter->disc_sessions, req);
1303 return dbus_message_new_method_return(msg);
1306 static DBusMessage *adapter_stop_discovery(DBusConnection *conn,
1307 DBusMessage *msg, void *data)
1309 struct btd_adapter *adapter = data;
1310 struct session_req *req;
1311 const char *sender = dbus_message_get_sender(msg);
1314 return btd_error_not_ready(msg);
1316 req = find_session(adapter->disc_sessions, sender);
1318 return btd_error_failed(msg, "Invalid discovery session");
1321 info("Stopping discovery");
1322 return dbus_message_new_method_return(msg);
1325 struct remote_device_list_t {
1330 static DBusMessage *get_properties(DBusConnection *conn,
1331 DBusMessage *msg, void *data)
1333 struct btd_adapter *adapter = data;
1334 const char *property;
1336 DBusMessageIter iter;
1337 DBusMessageIter dict;
1338 char str[MAX_NAME_LENGTH + 1], srcaddr[18];
1340 char **devices, **uuids;
1344 info("Get properties 1\n");
1345 ba2str(&adapter->bdaddr, srcaddr);
1347 if (check_address(srcaddr) < 0)
1348 return btd_error_invalid_args(msg);
1350 reply = dbus_message_new_method_return(msg);
1354 dbus_message_iter_init_append(reply, &iter);
1356 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1357 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
1358 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
1359 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
1363 dict_append_entry(&dict, "Address", DBUS_TYPE_STRING, &property);
1366 memset(str, 0, sizeof(str));
1367 strncpy(str, (char *) adapter->dev.name, MAX_NAME_LENGTH);
1370 dict_append_entry(&dict, "Name", DBUS_TYPE_STRING, &property);
1373 dict_append_entry(&dict, "Class",
1374 DBUS_TYPE_UINT32, &adapter->dev_class);
1377 value = (adapter->up && !adapter->off_requested) ? TRUE : FALSE;
1378 dict_append_entry(&dict, "Powered", DBUS_TYPE_BOOLEAN, &value);
1381 value = adapter->scan_mode & SCAN_INQUIRY ? TRUE : FALSE;
1382 dict_append_entry(&dict, "Discoverable", DBUS_TYPE_BOOLEAN, &value);
1383 #ifdef __TIZEN_PATCH__
1384 // Adding limited property for setting limited discoverable mode
1386 dict_append_entry(&dict, "Limited", DBUS_TYPE_BOOLEAN,
1391 dict_append_entry(&dict, "Pairable", DBUS_TYPE_BOOLEAN,
1392 &adapter->pairable);
1394 /* DiscoverableTimeout */
1395 dict_append_entry(&dict, "DiscoverableTimeout",
1396 DBUS_TYPE_UINT32, &adapter->discov_timeout);
1398 /* PairableTimeout */
1399 dict_append_entry(&dict, "PairableTimeout",
1400 DBUS_TYPE_UINT32, &adapter->pairable_timeout);
1403 if (adapter->state & (STATE_PINQ | STATE_STDINQ | STATE_LE_SCAN))
1409 dict_append_entry(&dict, "Discovering", DBUS_TYPE_BOOLEAN, &value);
1412 devices = g_new0(char *, g_slist_length(adapter->devices) + 1);
1413 for (i = 0, l = adapter->devices; l; l = l->next, i++) {
1414 struct btd_device *dev = l->data;
1415 devices[i] = (char *) device_get_path(dev);
1417 dict_append_array(&dict, "Devices", DBUS_TYPE_OBJECT_PATH,
1422 uuids = g_new0(char *, sdp_list_len(adapter->services) + 1);
1424 for (i = 0, list = adapter->services; list; list = list->next) {
1425 sdp_record_t *rec = list->data;
1428 uuid = bt_uuid2string(&rec->svclass);
1433 dict_append_array(&dict, "UUIDs", DBUS_TYPE_STRING, &uuids, i);
1437 dbus_message_iter_close_container(&iter, &dict);
1442 static DBusMessage *set_property(DBusConnection *conn,
1443 DBusMessage *msg, void *data)
1445 info(" set_property 1 \n");
1446 struct btd_adapter *adapter = data;
1447 DBusMessageIter iter;
1448 DBusMessageIter sub;
1449 const char *property;
1452 ba2str(&adapter->bdaddr, srcaddr);
1454 if (!dbus_message_iter_init(msg, &iter))
1455 return btd_error_invalid_args(msg);
1457 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1458 return btd_error_invalid_args(msg);
1460 dbus_message_iter_get_basic(&iter, &property);
1461 dbus_message_iter_next(&iter);
1463 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1464 return btd_error_invalid_args(msg);
1465 dbus_message_iter_recurse(&iter, &sub);
1467 if (g_str_equal("Name", property)) {
1470 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_STRING)
1471 return btd_error_invalid_args(msg);
1472 dbus_message_iter_get_basic(&sub, &name);
1474 return set_name(conn, msg, name, data);
1475 } else if (g_str_equal("Powered", property)) {
1478 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1479 return btd_error_invalid_args(msg);
1481 dbus_message_iter_get_basic(&sub, &powered);
1483 return set_powered(conn, msg, powered, data);
1484 } else if (g_str_equal("Discoverable", property)) {
1485 gboolean discoverable;
1487 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1488 return btd_error_invalid_args(msg);
1490 dbus_message_iter_get_basic(&sub, &discoverable);
1492 return set_discoverable(conn, msg, discoverable, data);
1493 #ifdef __TIZEN_PATCH__
1494 // Adding limited property for setting limited discoverable mode
1495 } else if (g_str_equal("Limited", property)) {
1498 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1499 return btd_error_invalid_args(msg);
1501 dbus_message_iter_get_basic(&sub, &limited);
1503 /// return set_limited(conn, msg, limited, data);
1504 return btd_error_invalid_args(msg);
1506 } else if (g_str_equal("DiscoverableTimeout", property)) {
1509 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1510 return btd_error_invalid_args(msg);
1512 dbus_message_iter_get_basic(&sub, &timeout);
1514 return set_discoverable_timeout(conn, msg, timeout, data);
1515 } else if (g_str_equal("Pairable", property)) {
1518 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1519 return btd_error_invalid_args(msg);
1521 dbus_message_iter_get_basic(&sub, &pairable);
1523 return set_pairable(conn, msg, pairable, data);
1524 } else if (g_str_equal("PairableTimeout", property)) {
1527 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_UINT32)
1528 return btd_error_invalid_args(msg);
1530 dbus_message_iter_get_basic(&sub, &timeout);
1532 return set_pairable_timeout(conn, msg, timeout, data);
1535 return btd_error_invalid_args(msg);
1538 static DBusMessage *request_session(DBusConnection *conn,
1539 DBusMessage *msg, void *data)
1541 struct btd_adapter *adapter = data;
1542 struct session_req *req;
1543 const char *sender = dbus_message_get_sender(msg);
1547 if (!adapter->agent)
1548 return btd_error_agent_not_available(msg);
1550 if (!adapter->mode_sessions)
1551 adapter->global_mode = adapter->mode;
1553 new_mode = get_mode(&adapter->bdaddr, "on");
1555 req = find_session(adapter->mode_sessions, sender);
1558 return dbus_message_new_method_return(msg);
1560 req = create_session(adapter, conn, msg, new_mode,
1561 session_owner_exit);
1562 adapter->mode_sessions = g_slist_append(adapter->mode_sessions,
1566 /* No need to change mode */
1567 if (adapter->mode >= new_mode)
1568 return dbus_message_new_method_return(msg);
1570 err = agent_confirm_mode_change(adapter->agent, mode2str(new_mode),
1571 confirm_mode_cb, req, NULL);
1574 return btd_error_failed(msg, strerror(-err));
1580 static DBusMessage *release_session(DBusConnection *conn,
1581 DBusMessage *msg, void *data)
1583 struct btd_adapter *adapter = data;
1584 struct session_req *req;
1585 const char *sender = dbus_message_get_sender(msg);
1587 req = find_session(adapter->mode_sessions, sender);
1589 return btd_error_failed(msg, "Invalid Session");
1593 return dbus_message_new_method_return(msg);
1596 static DBusMessage *list_devices(DBusConnection *conn,
1597 DBusMessage *msg, void *data)
1599 struct btd_adapter *adapter = data;
1602 DBusMessageIter iter;
1603 DBusMessageIter array_iter;
1604 const gchar *dev_path;
1606 if (!dbus_message_has_signature(msg, DBUS_TYPE_INVALID_AS_STRING))
1607 return btd_error_invalid_args(msg);
1609 reply = dbus_message_new_method_return(msg);
1613 dbus_message_iter_init_append(reply, &iter);
1614 dbus_message_iter_open_container(&iter, DBUS_TYPE_ARRAY,
1615 DBUS_TYPE_OBJECT_PATH_AS_STRING, &array_iter);
1617 for (l = adapter->devices; l; l = l->next) {
1618 struct btd_device *device = l->data;
1620 dev_path = device_get_path(device);
1622 dbus_message_iter_append_basic(&array_iter,
1623 DBUS_TYPE_OBJECT_PATH, &dev_path);
1626 dbus_message_iter_close_container(&iter, &array_iter);
1631 static DBusMessage *cancel_device_creation(DBusConnection *conn,
1632 DBusMessage *msg, void *data)
1634 struct btd_adapter *adapter = data;
1635 const gchar *address, *sender = dbus_message_get_sender(msg);
1636 struct btd_device *device;
1638 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1639 DBUS_TYPE_INVALID) == FALSE)
1640 return btd_error_invalid_args(msg);
1642 if (check_address(address) < 0)
1643 return btd_error_invalid_args(msg);
1645 device = adapter_find_device(adapter, address);
1646 if (!device || !device_is_creating(device, NULL))
1647 return btd_error_does_not_exist(msg);
1649 if (!device_is_creating(device, sender))
1650 return btd_error_not_authorized(msg);
1652 device_set_temporary(device, TRUE);
1654 if (device_is_connected(device)) {
1655 device_request_disconnect(device, msg);
1659 adapter_remove_device(conn, adapter, device, TRUE);
1661 return dbus_message_new_method_return(msg);
1664 static device_type_t flags2type(uint8_t flags)
1666 /* Inferring the remote type based on the EIR Flags field */
1668 /* For LE only and dual mode the following flags must be zero */
1669 if (flags & (EIR_SIM_CONTROLLER | EIR_SIM_HOST))
1670 return DEVICE_TYPE_UNKNOWN;
1672 /* Limited or General discoverable mode bit must be enabled */
1673 if (!(flags & (EIR_LIM_DISC | EIR_GEN_DISC)))
1674 return DEVICE_TYPE_UNKNOWN;
1676 if (flags & EIR_BREDR_UNSUP)
1677 return DEVICE_TYPE_LE;
1679 return DEVICE_TYPE_DUALMODE;
1682 static gboolean event_is_connectable(uint8_t type)
1686 case ADV_TYPE_DIRECT_IND:
1693 static struct btd_device *create_device_internal(DBusConnection *conn,
1694 struct btd_adapter *adapter,
1695 const gchar *address,
1696 gboolean force, int *err)
1698 struct remote_dev_info *dev, match;
1699 struct btd_device *device;
1702 memset(&match, 0, sizeof(struct remote_dev_info));
1703 str2ba(address, &match.bdaddr);
1704 match.name_status = NAME_ANY;
1706 dev = adapter_search_found_devices(adapter, &match);
1707 if (dev && dev->flags)
1708 type = flags2type(dev->flags);
1710 type = DEVICE_TYPE_BREDR;
1712 if (!force && type == DEVICE_TYPE_LE &&
1713 !event_is_connectable(dev->evt_type)) {
1720 device = adapter_create_device(conn, adapter, address, type);
1727 static DBusMessage *create_device(DBusConnection *conn,
1728 DBusMessage *msg, void *data)
1730 struct btd_adapter *adapter = data;
1731 struct btd_device *device;
1732 const gchar *address;
1736 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1737 DBUS_TYPE_INVALID) == FALSE)
1738 return btd_error_invalid_args(msg);
1740 if (check_address(address) < 0)
1741 return btd_error_invalid_args(msg);
1744 return btd_error_not_ready(msg);
1746 if (adapter_find_device(adapter, address))
1747 return btd_error_already_exists(msg);
1751 device = create_device_internal(conn, adapter, address, TRUE, &err);
1755 if (device_get_type(device) != DEVICE_TYPE_LE)
1756 err = device_browse_sdp(device, conn, msg, NULL, FALSE);
1758 err = device_browse_primary(device, conn, msg, FALSE);
1761 adapter_remove_device(conn, adapter, device, TRUE);
1762 return btd_error_failed(msg, strerror(-err));
1768 if (err == -ENOTCONN) {
1769 /* Device is not connectable */
1770 const char *path = device_get_path(device);
1772 reply = dbus_message_new_method_return(msg);
1774 dbus_message_append_args(reply,
1775 DBUS_TYPE_OBJECT_PATH, &path,
1778 reply = btd_error_failed(msg, strerror(-err));
1783 static uint8_t parse_io_capability(const char *capability)
1785 if (g_str_equal(capability, ""))
1786 return IO_CAPABILITY_DISPLAYYESNO;
1787 if (g_str_equal(capability, "DisplayOnly"))
1788 return IO_CAPABILITY_DISPLAYONLY;
1789 if (g_str_equal(capability, "DisplayYesNo"))
1790 return IO_CAPABILITY_DISPLAYYESNO;
1791 if (g_str_equal(capability, "KeyboardOnly"))
1792 return IO_CAPABILITY_KEYBOARDONLY;
1793 if (g_str_equal(capability, "NoInputNoOutput"))
1794 return IO_CAPABILITY_NOINPUTNOOUTPUT;
1795 return IO_CAPABILITY_INVALID;
1797 #ifdef __TIZEN_PATCH__
1798 DBusMessage *adapter_encrypt_link(DBusConnection *conn,
1800 const char *address,
1801 dbus_bool_t encrypt,
1805 struct btd_adapter *adapter = data;
1806 struct btd_device *device;
1807 char filename[PATH_MAX + 1];
1809 struct hci_conn_info_req *cr;
1813 DBG("handle_authenticate_link_request1");
1814 device = adapter_get_device(conn, adapter, address);
1816 str2ba(address, &bdaddr);
1817 /* check if there is a pending discover: requested by D-Bus/non clients */
1820 return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", "Discover in progress");
1822 pending_remote_name_cancel(adapter);
1824 if (device_get_bonding(device))
1825 return g_dbus_create_error(msg, ERROR_INTERFACE ".InProgress", "Bonding in progress");
1828 /*if (adapter_find_auth_request(adapter, &bdaddr))
1829 return in_progress(msg, "Bonding in progress");*/
1831 /* check if a link key already exists */
1832 create_name(filename, PATH_MAX, STORAGEDIR,address,
1835 dd = hci_open_dev(dev_id);
1837 return g_dbus_create_error(msg,
1838 ERROR_INTERFACE ".Failed",
1839 "Device open failed");
1842 cr = malloc(sizeof(*cr) + sizeof(struct hci_conn_info));
1847 bacpy(&cr->bdaddr, &bdaddr);
1848 cr->type = ACL_LINK;
1849 if (ioctl(dd, HCIGETCONNINFO, (unsigned long) cr) < 0) {
1851 return g_dbus_create_error(msg,
1852 ERROR_INTERFACE ".Failed",
1853 "Getting connection info failed");
1857 if (hci_authenticate_link(dd, htobs(cr->conn_info->handle), 25000) < 0) {
1859 return g_dbus_create_error(msg,
1860 ERROR_INTERFACE ".Failed",
1861 "Authentication request failed");
1865 info("Encrypt value %d",encrypt);
1866 if (hci_encrypt_link(dd, htobs(cr->conn_info->handle), encrypt, 25000) < 0) {
1868 return g_dbus_create_error(msg,
1869 ERROR_INTERFACE ".Failed",
1870 "Encryption request failed");
1873 DBG("handle_authenticate_link_request2");
1878 return dbus_message_new_method_return(msg);
1886 #ifdef __TIZEN_PATCH__
1887 static DBusMessage *authenticate_link(DBusConnection *conn,
1888 DBusMessage *msg, void *data)
1890 struct btd_adapter *adapter = data;
1891 struct btd_device *device;
1892 const gchar *address, *agent_path, *capability, *sender;
1894 info("authenticate_link 1\n");
1895 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1896 DBUS_TYPE_OBJECT_PATH, &agent_path,
1897 DBUS_TYPE_STRING, &capability,
1898 DBUS_TYPE_INVALID) == FALSE)
1899 return btd_error_invalid_args(msg);
1900 info("authenticate_link 2\n");
1901 if (check_address(address) < 0)
1902 return btd_error_invalid_args(msg);
1903 info("authenticate_link 3\n");
1904 sender = dbus_message_get_sender(msg);
1905 if (adapter->agent &&
1906 agent_matches(adapter->agent, sender, agent_path)) {
1907 error("Refusing adapter agent usage as device specific one");
1908 return btd_error_invalid_args(msg);
1910 info("authenticate_link 4\n");
1911 cap = parse_io_capability(capability);
1912 if (cap == IO_CAPABILITY_INVALID)
1913 return btd_error_invalid_args(msg);
1914 info("authenticate_link 5\n");
1915 device = adapter_get_device(conn, adapter, address);
1917 return g_dbus_create_error(msg,
1918 ERROR_INTERFACE ".Failed",
1919 "Unable to create a new device object");
1920 info("authenticate_link 5\n");
1921 return device_jsr82_authenticate_link(device, conn, msg, agent_path, cap);
1925 #ifdef __TIZEN_PATCH__
1926 static DBusMessage *encrypt_connection(DBusConnection *conn,
1927 DBusMessage *msg, void *data)
1929 struct btd_adapter *adapter = data;
1930 gboolean encrypt = FALSE;
1931 DBG("encrypt_link");
1932 info("encrypt_connection value 1 %d",encrypt);
1934 return btd_error_not_ready(msg);
1935 DBusMessageIter iter;
1936 DBusMessageIter sub;
1937 const char *address;
1940 if (!dbus_message_iter_init(msg, &iter))
1941 return btd_error_invalid_args(msg);
1943 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_STRING)
1944 return btd_error_invalid_args(msg);
1946 dbus_message_iter_get_basic(&iter, &address);
1947 dbus_message_iter_next(&iter);
1949 if (dbus_message_iter_get_arg_type(&iter) != DBUS_TYPE_VARIANT)
1950 return btd_error_invalid_args(msg);
1951 dbus_message_iter_recurse(&iter, &sub);
1953 if (dbus_message_iter_get_arg_type(&sub) != DBUS_TYPE_BOOLEAN)
1954 return btd_error_invalid_args(msg);
1956 dbus_message_iter_get_basic(&sub, &encrypt);
1957 /* if (!dbus_message_get_args(msg, NULL,
1958 DBUS_TYPE_STRING, &address, DBUS_TYPE_BOOLEAN,&encrypt,
1960 return btd_error_invalid_args(msg);*/
1962 info("encrypt_connection value 2 %d",encrypt);
1963 return adapter_encrypt_link(conn, msg, address, encrypt, data);
1967 static DBusMessage *create_paired_device(DBusConnection *conn,
1968 DBusMessage *msg, void *data)
1970 struct btd_adapter *adapter = data;
1971 struct btd_device *device;
1972 const gchar *address, *agent_path, *capability, *sender;
1976 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
1977 DBUS_TYPE_OBJECT_PATH, &agent_path,
1978 DBUS_TYPE_STRING, &capability,
1979 DBUS_TYPE_INVALID) == FALSE)
1980 return btd_error_invalid_args(msg);
1982 if (check_address(address) < 0)
1983 return btd_error_invalid_args(msg);
1986 return btd_error_not_ready(msg);
1988 sender = dbus_message_get_sender(msg);
1989 if (adapter->agent &&
1990 agent_matches(adapter->agent, sender, agent_path)) {
1991 error("Refusing adapter agent usage as device specific one");
1992 return btd_error_invalid_args(msg);
1995 cap = parse_io_capability(capability);
1996 if (cap == IO_CAPABILITY_INVALID)
1997 return btd_error_invalid_args(msg);
1999 device = adapter_find_device(adapter, address);
2001 device = create_device_internal(conn, adapter, address,
2004 return btd_error_failed(msg, strerror(-err));
2007 if (device_get_type(device) != DEVICE_TYPE_LE)
2008 return device_create_bonding(device, conn, msg,
2011 err = device_browse_primary(device, conn, msg, TRUE);
2013 return btd_error_failed(msg, strerror(-err));
2018 static gint device_path_cmp(struct btd_device *device, const gchar *path)
2020 const gchar *dev_path = device_get_path(device);
2022 return strcasecmp(dev_path, path);
2025 static DBusMessage *remove_device(DBusConnection *conn, DBusMessage *msg,
2028 struct btd_adapter *adapter = data;
2029 struct btd_device *device;
2033 if (dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
2034 DBUS_TYPE_INVALID) == FALSE)
2035 return btd_error_invalid_args(msg);
2037 l = g_slist_find_custom(adapter->devices,
2038 path, (GCompareFunc) device_path_cmp);
2040 return btd_error_does_not_exist(msg);
2044 if (device_is_temporary(device) || device_is_busy(device))
2045 return g_dbus_create_error(msg,
2046 ERROR_INTERFACE ".DoesNotExist",
2047 "Device creation in progress");
2049 device_set_temporary(device, TRUE);
2051 if (!device_is_connected(device)) {
2052 adapter_remove_device(conn, adapter, device, TRUE);
2053 return dbus_message_new_method_return(msg);
2056 device_request_disconnect(device, msg);
2060 static DBusMessage *find_device(DBusConnection *conn, DBusMessage *msg,
2063 struct btd_adapter *adapter = data;
2064 struct btd_device *device;
2066 const gchar *address;
2068 const gchar *dev_path;
2070 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_STRING, &address,
2072 return btd_error_invalid_args(msg);
2074 l = g_slist_find_custom(adapter->devices,
2075 address, (GCompareFunc) device_address_cmp);
2077 return btd_error_does_not_exist(msg);
2081 reply = dbus_message_new_method_return(msg);
2085 dev_path = device_get_path(device);
2087 dbus_message_append_args(reply,
2088 DBUS_TYPE_OBJECT_PATH, &dev_path,
2094 static void agent_removed(struct agent *agent, struct btd_adapter *adapter)
2096 adapter_ops->set_io_capability(adapter->dev_id,
2097 IO_CAPABILITY_NOINPUTNOOUTPUT);
2099 adapter->agent = NULL;
2102 static DBusMessage *register_agent(DBusConnection *conn, DBusMessage *msg,
2105 const char *path, *name, *capability;
2106 struct agent *agent;
2107 struct btd_adapter *adapter = data;
2110 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
2111 DBUS_TYPE_STRING, &capability, DBUS_TYPE_INVALID))
2115 return btd_error_already_exists(msg);
2117 cap = parse_io_capability(capability);
2118 if (cap == IO_CAPABILITY_INVALID)
2119 return btd_error_invalid_args(msg);
2121 name = dbus_message_get_sender(msg);
2123 agent = agent_create(adapter, name, path, cap,
2124 (agent_remove_cb) agent_removed, adapter);
2126 return btd_error_failed(msg, "Failed to create a new agent");
2128 adapter->agent = agent;
2130 DBG("Agent registered for hci%d at %s:%s", adapter->dev_id, name,
2133 adapter_ops->set_io_capability(adapter->dev_id, cap);
2135 return dbus_message_new_method_return(msg);
2138 static DBusMessage *unregister_agent(DBusConnection *conn, DBusMessage *msg,
2141 const char *path, *name;
2142 struct btd_adapter *adapter = data;
2144 if (!dbus_message_get_args(msg, NULL, DBUS_TYPE_OBJECT_PATH, &path,
2148 name = dbus_message_get_sender(msg);
2150 if (!adapter->agent || !agent_matches(adapter->agent, name, path))
2151 return btd_error_does_not_exist(msg);
2153 agent_free(adapter->agent);
2154 adapter->agent = NULL;
2156 return dbus_message_new_method_return(msg);
2159 static GDBusMethodTable adapter_methods[] = {
2160 { "GetProperties", "", "a{sv}",get_properties },
2161 { "SetProperty", "sv", "", set_property,
2162 G_DBUS_METHOD_FLAG_ASYNC},
2163 { "RequestSession", "", "", request_session,
2164 G_DBUS_METHOD_FLAG_ASYNC},
2165 { "ReleaseSession", "", "", release_session },
2166 { "StartDiscovery", "", "", adapter_start_discovery },
2167 { "StopDiscovery", "", "", adapter_stop_discovery,
2168 G_DBUS_METHOD_FLAG_ASYNC},
2169 { "ListDevices", "", "ao", list_devices,
2170 G_DBUS_METHOD_FLAG_DEPRECATED},
2171 { "CreateDevice", "s", "o", create_device,
2172 G_DBUS_METHOD_FLAG_ASYNC},
2173 { "CreatePairedDevice", "sos", "o", create_paired_device,
2174 G_DBUS_METHOD_FLAG_ASYNC},
2175 { "CancelDeviceCreation","s", "", cancel_device_creation,
2176 G_DBUS_METHOD_FLAG_ASYNC},
2177 { "RemoveDevice", "o", "", remove_device,
2178 G_DBUS_METHOD_FLAG_ASYNC},
2179 { "FindDevice", "s", "o", find_device },
2180 { "RegisterAgent", "os", "", register_agent },
2181 { "UnregisterAgent", "o", "", unregister_agent },
2183 #ifdef __TIZEN_PATCH__
2184 { "AuthenticateLink","sos", "o", authenticate_link, G_DBUS_METHOD_FLAG_ASYNC},
2185 { "EncryptLink","sv", "", encrypt_connection, G_DBUS_METHOD_FLAG_ASYNC},
2190 static GDBusSignalTable adapter_signals[] = {
2191 { "PropertyChanged", "sv" },
2192 { "DeviceCreated", "o" },
2193 { "DeviceRemoved", "o" },
2194 { "DeviceFound", "sa{sv}" },
2195 { "DeviceDisappeared", "s" },
2199 static void create_stored_device_from_profiles(char *key, char *value,
2202 struct btd_adapter *adapter = user_data;
2203 GSList *uuids = bt_string2list(value);
2204 struct btd_device *device;
2206 if (g_slist_find_custom(adapter->devices,
2207 key, (GCompareFunc) device_address_cmp))
2210 device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
2214 device_set_temporary(device, FALSE);
2215 adapter->devices = g_slist_append(adapter->devices, device);
2217 device_probe_drivers(device, uuids);
2219 g_slist_foreach(uuids, (GFunc) g_free, NULL);
2220 g_slist_free(uuids);
2223 struct adapter_keys {
2224 struct btd_adapter *adapter;
2228 static struct link_key_info *get_key_info(const char *addr, const char *value)
2230 struct link_key_info *info;
2235 if (strlen(value) < 36) {
2236 error("Unexpectedly short (%zu) link key line", strlen(value));
2240 info = g_new0(struct link_key_info, 1);
2242 str2ba(addr, &info->bdaddr);
2244 memset(tmp, 0, sizeof(tmp));
2246 for (i = 0; i < 16; i++) {
2247 memcpy(tmp, value + (i * 2), 2);
2248 info->key[i] = (uint8_t) strtol(tmp, NULL, 16);
2251 memcpy(tmp, value + 33, 2);
2252 info->type = (uint8_t) strtol(tmp, NULL, 10);
2254 memcpy(tmp, value + 35, 2);
2255 l = strtol(tmp, NULL, 10);
2263 static void create_stored_device_from_linkkeys(char *key, char *value,
2266 struct adapter_keys *keys = user_data;
2267 struct btd_adapter *adapter = keys->adapter;
2268 struct btd_device *device;
2269 struct link_key_info *info;
2271 info = get_key_info(key, value);
2273 keys->keys = g_slist_append(keys->keys, info);
2275 if (g_slist_find_custom(adapter->devices, key,
2276 (GCompareFunc) device_address_cmp))
2279 device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
2281 device_set_temporary(device, FALSE);
2282 adapter->devices = g_slist_append(adapter->devices, device);
2286 static void create_stored_device_from_blocked(char *key, char *value,
2289 struct btd_adapter *adapter = user_data;
2290 struct btd_device *device;
2292 if (g_slist_find_custom(adapter->devices,
2293 key, (GCompareFunc) device_address_cmp))
2296 device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
2298 device_set_temporary(device, FALSE);
2299 adapter->devices = g_slist_append(adapter->devices, device);
2303 static void create_stored_device_from_types(char *key, char *value,
2307 struct btd_adapter *adapter = user_data;
2308 struct btd_device *device;
2311 type = strtol(value, NULL, 16);
2313 l = g_slist_find_custom(adapter->devices,
2314 key, (GCompareFunc) device_address_cmp);
2317 device_set_type(device, type);
2321 device = device_create(connection, adapter, key, type);
2323 device_set_temporary(device, FALSE);
2324 adapter->devices = g_slist_append(adapter->devices, device);
2328 static GSList *string_to_primary_list(char *str)
2337 services = g_strsplit(str, " ", 0);
2338 if (services == NULL)
2341 for (i = 0; services[i]; i++) {
2342 struct att_primary *prim;
2345 prim = g_new0(struct att_primary, 1);
2347 ret = sscanf(services[i], "%04hX#%04hX#%s", &prim->start,
2348 &prim->end, prim->uuid);
2355 l = g_slist_append(l, prim);
2358 g_strfreev(services);
2363 static void create_stored_device_from_primary(char *key, char *value,
2366 struct btd_adapter *adapter = user_data;
2367 struct btd_device *device;
2368 GSList *services, *uuids, *l;
2370 l = g_slist_find_custom(adapter->devices,
2371 key, (GCompareFunc) device_address_cmp);
2375 device = device_create(connection, adapter, key, DEVICE_TYPE_BREDR);
2379 device_set_temporary(device, FALSE);
2380 adapter->devices = g_slist_append(adapter->devices, device);
2383 services = string_to_primary_list(value);
2384 if (services == NULL)
2387 for (l = services, uuids = NULL; l; l = l->next) {
2388 struct att_primary *prim = l->data;
2389 uuids = g_slist_append(uuids, prim->uuid);
2391 device_add_primary(device, prim);
2394 device_probe_drivers(device, uuids);
2396 g_slist_free(services);
2397 g_slist_free(uuids);
2400 static void load_devices(struct btd_adapter *adapter)
2402 char filename[PATH_MAX + 1];
2404 struct adapter_keys keys = { adapter, NULL };
2407 ba2str(&adapter->bdaddr, srcaddr);
2409 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "profiles");
2410 textfile_foreach(filename, create_stored_device_from_profiles,
2413 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "primary");
2414 textfile_foreach(filename, create_stored_device_from_primary,
2417 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "linkkeys");
2418 textfile_foreach(filename, create_stored_device_from_linkkeys, &keys);
2420 err = adapter_ops->load_keys(adapter->dev_id, keys.keys,
2421 main_opts.debug_keys);
2423 error("Unable to load keys to adapter_ops: %s (%d)",
2424 strerror(-err), -err);
2425 g_slist_foreach(keys.keys, (GFunc) g_free, NULL);
2426 g_slist_free(keys.keys);
2429 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "blocked");
2430 textfile_foreach(filename, create_stored_device_from_blocked, adapter);
2432 create_name(filename, PATH_MAX, STORAGEDIR, srcaddr, "types");
2433 textfile_foreach(filename, create_stored_device_from_types, adapter);
2436 int btd_adapter_block_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2438 return adapter_ops->block_device(adapter->dev_id, bdaddr);
2441 int btd_adapter_unblock_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
2443 return adapter_ops->unblock_device(adapter->dev_id, bdaddr);
2446 static void clear_blocked(struct btd_adapter *adapter)
2450 err = adapter_ops->unblock_device(adapter->dev_id, BDADDR_ANY);
2452 error("Clearing blocked list failed: %s (%d)",
2453 strerror(-err), -err);
2456 static void probe_driver(struct btd_adapter *adapter, gpointer user_data)
2458 struct btd_adapter_driver *driver = user_data;
2464 if (driver->probe == NULL)
2467 err = driver->probe(adapter);
2469 error("%s: %s (%d)", driver->name, strerror(-err), -err);
2473 adapter->loaded_drivers = g_slist_prepend(adapter->loaded_drivers,
2477 static void load_drivers(struct btd_adapter *adapter)
2481 for (l = adapter_drivers; l; l = l->next)
2482 probe_driver(adapter, l->data);
2485 static void load_connections(struct btd_adapter *adapter)
2490 err = adapter_ops->get_conn_list(adapter->dev_id, &conns);
2492 error("Unable to fetch existing connections: %s (%d)",
2493 strerror(-err), -err);
2497 for (l = conns; l != NULL; l = g_slist_next(l)) {
2498 bdaddr_t *bdaddr = l->data;
2499 struct btd_device *device;
2502 ba2str(bdaddr, address);
2503 DBG("Adding existing connection to %s", address);
2505 device = adapter_get_device(connection, adapter, address);
2507 adapter_add_connection(adapter, device);
2510 g_slist_foreach(conns, (GFunc) g_free, NULL);
2511 g_slist_free(conns);
2514 static int get_discoverable_timeout(const char *src)
2518 if (read_discoverable_timeout(src, &timeout) == 0)
2521 return main_opts.discovto;
2524 static int get_pairable_timeout(const char *src)
2528 if (read_pairable_timeout(src, &timeout) == 0)
2531 return main_opts.pairto;
2534 static void call_adapter_powered_callbacks(struct btd_adapter *adapter,
2539 for (l = adapter->powered_callbacks; l; l = l->next) {
2540 btd_adapter_powered_cb cb = l->data;
2542 cb(adapter, powered);
2546 static void emit_device_disappeared(gpointer data, gpointer user_data)
2548 struct remote_dev_info *dev = data;
2549 struct btd_adapter *adapter = user_data;
2551 const char *paddr = address;
2553 ba2str(&dev->bdaddr, address);
2555 g_dbus_emit_signal(connection, adapter->path,
2556 ADAPTER_INTERFACE, "DeviceDisappeared",
2557 DBUS_TYPE_STRING, &paddr,
2560 adapter->found_devices = g_slist_remove(adapter->found_devices, dev);
2563 static void update_oor_devices(struct btd_adapter *adapter)
2565 g_slist_foreach(adapter->oor_devices, emit_device_disappeared, adapter);
2566 g_slist_foreach(adapter->oor_devices, (GFunc) dev_info_free, NULL);
2567 g_slist_free(adapter->oor_devices);
2568 adapter->oor_devices = g_slist_copy(adapter->found_devices);
2571 static gboolean bredr_capable(struct btd_adapter *adapter)
2573 struct hci_dev *dev = &adapter->dev;
2575 return (dev->features[4] & LMP_NO_BREDR) == 0 ? TRUE : FALSE;
2578 static gboolean le_capable(struct btd_adapter *adapter)
2580 struct hci_dev *dev = &adapter->dev;
2582 return (dev->features[4] & LMP_LE &&
2583 dev->extfeatures[0] & LMP_HOST_LE) ? TRUE : FALSE;
2586 int adapter_get_discover_type(struct btd_adapter *adapter)
2591 le = le_capable(adapter);
2592 bredr = bredr_capable(adapter);
2595 type = bredr ? DISC_INTERLEAVE : DISC_LE;
2597 type = main_opts.discov_interval ? DISC_STDINQ :
2600 if (main_opts.name_resolv)
2601 type |= DISC_RESOLVNAME;
2606 void btd_adapter_get_mode(struct btd_adapter *adapter, uint8_t *mode,
2607 uint8_t *on_mode, gboolean *pairable)
2609 char str[14], address[18];
2611 ba2str(&adapter->bdaddr, address);
2614 if (main_opts.remember_powered == FALSE)
2615 *mode = main_opts.mode;
2616 else if (read_device_mode(address, str, sizeof(str)) < 0)
2617 *mode = main_opts.mode;
2619 *mode = get_mode(&adapter->bdaddr, str);
2623 if (main_opts.remember_powered == FALSE) {
2624 if (adapter->initialized)
2625 *on_mode = get_mode(&adapter->bdaddr, "on");
2627 *on_mode = main_opts.mode;
2628 adapter->initialized = TRUE;
2630 } else if (read_on_mode(address, str, sizeof(str)) < 0)
2631 *on_mode = main_opts.mode;
2633 *on_mode = get_mode(&adapter->bdaddr, str);
2637 *pairable = adapter->pairable;
2640 void btd_adapter_start(struct btd_adapter *adapter)
2646 ba2str(&adapter->bdaddr, address);
2648 adapter->dev_class = 0;
2649 adapter->off_requested = FALSE;
2651 adapter->discov_timeout = get_discoverable_timeout(address);
2652 adapter->pairable_timeout = get_pairable_timeout(address);
2653 adapter->state = STATE_IDLE;
2654 adapter->mode = MODE_CONNECTABLE;
2657 adapter_ops->enable_le(adapter->dev_id);
2659 adapter_ops->set_name(adapter->dev_id, adapter->dev.name);
2661 if (read_local_class(&adapter->bdaddr, cls) < 0) {
2662 uint32_t class = htobl(main_opts.class);
2663 memcpy(cls, &class, 3);
2666 btd_adapter_set_class(adapter, cls[1], cls[0]);
2669 emit_property_changed(connection, adapter->path,
2670 ADAPTER_INTERFACE, "Powered",
2671 DBUS_TYPE_BOOLEAN, &powered);
2673 call_adapter_powered_callbacks(adapter, TRUE);
2675 adapter_ops->disable_cod_cache(adapter->dev_id);
2677 info("Adapter %s has been enabled", adapter->path);
2680 static void reply_pending_requests(struct btd_adapter *adapter)
2687 /* pending bonding */
2688 for (l = adapter->devices; l; l = l->next) {
2689 struct btd_device *device = l->data;
2691 if (device_is_bonding(device, NULL))
2692 device_cancel_bonding(device,
2693 HCI_OE_USER_ENDED_CONNECTION);
2697 static void remove_driver(gpointer data, gpointer user_data)
2699 struct btd_adapter_driver *driver = data;
2700 struct btd_adapter *adapter = user_data;
2703 driver->remove(adapter);
2706 static void unload_drivers(struct btd_adapter *adapter)
2708 g_slist_foreach(adapter->loaded_drivers, remove_driver, adapter);
2709 g_slist_free(adapter->loaded_drivers);
2710 adapter->loaded_drivers = NULL;
2713 static void set_mode_complete(struct btd_adapter *adapter)
2715 struct session_req *pending;
2716 const char *modestr;
2721 if (adapter->pending_mode == NULL)
2724 pending = adapter->pending_mode;
2725 adapter->pending_mode = NULL;
2727 err = (pending->mode != adapter->mode) ? -EINVAL : 0;
2729 if (pending->msg != NULL) {
2730 DBusMessage *msg = pending->msg;
2734 reply = btd_error_failed(msg, strerror(-err));
2736 if (strcmp(dbus_message_get_member(msg),
2737 "SetProperty") == 0)
2738 adapter->global_mode = adapter->mode;
2739 reply = g_dbus_create_reply(msg, DBUS_TYPE_INVALID);
2742 g_dbus_send_message(connection, reply);
2745 modestr = mode2str(adapter->mode);
2749 /* restore if the mode doesn't matches the pending */
2751 write_device_mode(&adapter->bdaddr, modestr);
2752 error("unable to set mode: %s", mode2str(pending->mode));
2755 session_unref(pending);
2758 int btd_adapter_stop(struct btd_adapter *adapter)
2760 gboolean powered, discoverable, pairable;
2761 #ifdef __TIZEN_PATCH__
2765 /* cancel pending timeout */
2766 if (adapter->discov_timeout_id) {
2767 g_source_remove(adapter->discov_timeout_id);
2768 adapter->discov_timeout_id = 0;
2771 /* check pending requests */
2772 reply_pending_requests(adapter);
2774 stop_discovery(adapter, FALSE);
2776 if (adapter->disc_sessions) {
2777 g_slist_foreach(adapter->disc_sessions, (GFunc) session_free,
2779 g_slist_free(adapter->disc_sessions);
2780 adapter->disc_sessions = NULL;
2783 while (adapter->connections) {
2784 struct btd_device *device = adapter->connections->data;
2785 adapter_remove_connection(adapter, device);
2788 if (adapter->scan_mode == (SCAN_PAGE | SCAN_INQUIRY)) {
2789 discoverable = FALSE;
2790 emit_property_changed(connection, adapter->path,
2791 ADAPTER_INTERFACE, "Discoverable",
2792 DBUS_TYPE_BOOLEAN, &discoverable);
2795 if ((adapter->scan_mode & SCAN_PAGE) && adapter->pairable == TRUE) {
2797 emit_property_changed(connection, adapter->path,
2798 ADAPTER_INTERFACE, "Pairable",
2799 DBUS_TYPE_BOOLEAN, &pairable);
2803 emit_property_changed(connection, adapter->path, ADAPTER_INTERFACE,
2804 "Powered", DBUS_TYPE_BOOLEAN, &powered);
2807 adapter->scan_mode = SCAN_DISABLED;
2808 adapter->mode = MODE_OFF;
2809 adapter->state = STATE_IDLE;
2810 adapter->off_requested = FALSE;
2811 adapter->name_stored = FALSE;
2813 call_adapter_powered_callbacks(adapter, FALSE);
2815 info("Adapter %s has been disabled", adapter->path);
2817 set_mode_complete(adapter);
2822 int adapter_update_ssp_mode(struct btd_adapter *adapter, uint8_t mode)
2824 struct hci_dev *dev = &adapter->dev;
2826 dev->ssp_mode = mode;
2831 static void adapter_free(gpointer user_data)
2833 struct btd_adapter *adapter = user_data;
2835 agent_free(adapter->agent);
2836 adapter->agent = NULL;
2840 if (adapter->auth_idle_id)
2841 g_source_remove(adapter->auth_idle_id);
2843 sdp_list_free(adapter->services, NULL);
2845 g_slist_foreach(adapter->found_devices, (GFunc) dev_info_free, NULL);
2846 g_slist_free(adapter->found_devices);
2848 g_slist_free(adapter->oor_devices);
2850 g_free(adapter->path);
2854 struct btd_adapter *btd_adapter_ref(struct btd_adapter *adapter)
2858 DBG("%p: ref=%d", adapter, adapter->ref);
2863 void btd_adapter_unref(struct btd_adapter *adapter)
2869 DBG("%p: ref=%d", adapter, adapter->ref);
2871 if (adapter->ref > 0)
2874 path = g_strdup(adapter->path);
2876 g_dbus_unregister_interface(connection, path, ADAPTER_INTERFACE);
2881 gboolean adapter_init(struct btd_adapter *adapter)
2883 struct hci_version ver;
2884 struct hci_dev *dev;
2887 /* adapter_ops makes sure that newly registered adapters always
2888 * start off as powered */
2891 adapter_ops->read_bdaddr(adapter->dev_id, &adapter->bdaddr);
2893 if (bacmp(&adapter->bdaddr, BDADDR_ANY) == 0) {
2894 error("No address available for hci%d", adapter->dev_id);
2898 err = adapter_ops->read_local_version(adapter->dev_id, &ver);
2900 error("Can't read version info for hci%d: %s (%d)",
2901 adapter->dev_id, strerror(-err), -err);
2905 dev = &adapter->dev;
2907 dev->hci_rev = ver.hci_rev;
2908 dev->lmp_ver = ver.lmp_ver;
2909 dev->lmp_subver = ver.lmp_subver;
2910 dev->manufacturer = ver.manufacturer;
2912 err = adapter_ops->read_local_features(adapter->dev_id, dev->features);
2914 error("Can't read features for hci%d: %s (%d)",
2915 adapter->dev_id, strerror(-err), -err);
2919 if (read_local_name(&adapter->bdaddr, adapter->dev.name) < 0)
2920 expand_name(adapter->dev.name, MAX_NAME_LENGTH, main_opts.name,
2923 if (main_opts.attrib_server)
2924 attrib_gap_set(GATT_CHARAC_DEVICE_NAME,
2925 (const uint8_t *) dev->name, strlen(dev->name));
2927 sdp_init_services_list(&adapter->bdaddr);
2928 load_drivers(adapter);
2929 clear_blocked(adapter);
2930 load_devices(adapter);
2932 /* Set pairable mode */
2933 if (read_device_pairable(&adapter->bdaddr, &adapter->pairable) < 0)
2934 adapter->pairable = TRUE;
2936 /* retrieve the active connections: address the scenario where
2937 * the are active connections before the daemon've started */
2938 load_connections(adapter);
2943 struct btd_adapter *adapter_create(DBusConnection *conn, int id)
2945 char path[MAX_PATH_LENGTH];
2946 struct btd_adapter *adapter;
2947 const char *base_path = manager_get_base_path();
2952 adapter = g_try_new0(struct btd_adapter, 1);
2954 error("adapter_create: failed to alloc memory for hci%d", id);
2958 adapter->dev_id = id;
2960 snprintf(path, sizeof(path), "%s/hci%d", base_path, id);
2961 adapter->path = g_strdup(path);
2963 if (!g_dbus_register_interface(conn, path, ADAPTER_INTERFACE,
2964 adapter_methods, adapter_signals, NULL,
2965 adapter, adapter_free)) {
2966 error("Adapter interface init failed on path %s", path);
2967 adapter_free(adapter);
2971 return btd_adapter_ref(adapter);
2974 void adapter_remove(struct btd_adapter *adapter)
2978 DBG("Removing adapter %s", adapter->path);
2980 for (l = adapter->devices; l; l = l->next)
2981 device_remove(l->data, FALSE);
2982 g_slist_free(adapter->devices);
2984 unload_drivers(adapter);
2986 /* Return adapter to down state if it was not up on init */
2987 adapter_ops->restore_powered(adapter->dev_id);
2989 btd_adapter_unref(adapter);
2992 uint16_t adapter_get_dev_id(struct btd_adapter *adapter)
2994 return adapter->dev_id;
2997 const gchar *adapter_get_path(struct btd_adapter *adapter)
3002 return adapter->path;
3005 void adapter_get_address(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3007 bacpy(bdaddr, &adapter->bdaddr);
3010 void adapter_set_state(struct btd_adapter *adapter, int state)
3012 const char *path = adapter->path;
3013 gboolean discov_active;
3016 if (adapter->state == state)
3019 previous = adapter->state;
3020 adapter->state = state;
3022 type = adapter_get_discover_type(adapter);
3027 discov_active = TRUE;
3029 /* Started a new session while resolving names ? */
3030 if (previous & STATE_RESOLVNAME)
3034 /* Scanning enabled */
3035 adapter->stop_discov_id = g_timeout_add(5120,
3036 stop_scanning, adapter);
3038 /* For dual mode: don't send "Discovering = TRUE" */
3039 if (bredr_capable(adapter) == TRUE)
3043 discov_active = TRUE;
3048 * Interleave: from inquiry to scanning. Interleave is not
3049 * applicable to requests triggered by external applications.
3051 if (adapter->disc_sessions && (type & DISC_INTERLEAVE) &&
3052 (previous & STATE_STDINQ)) {
3053 adapter_ops->start_scanning(adapter->dev_id);
3056 /* BR/EDR only: inquiry finished */
3057 discov_active = FALSE;
3060 discov_active = FALSE;
3064 if (discov_active == FALSE) {
3065 if (type & DISC_RESOLVNAME) {
3066 if (adapter_resolve_names(adapter) == 0) {
3067 adapter->state |= STATE_RESOLVNAME;
3072 update_oor_devices(adapter);
3073 } else if (adapter->disc_sessions && main_opts.discov_interval)
3074 adapter->scheduler_id = g_timeout_add_seconds(
3075 main_opts.discov_interval,
3076 (GSourceFunc) start_discovery,
3079 emit_property_changed(connection, path,
3080 ADAPTER_INTERFACE, "Discovering",
3081 DBUS_TYPE_BOOLEAN, &discov_active);
3084 int adapter_get_state(struct btd_adapter *adapter)
3086 return adapter->state;
3089 struct remote_dev_info *adapter_search_found_devices(struct btd_adapter *adapter,
3090 struct remote_dev_info *match)
3094 l = g_slist_find_custom(adapter->found_devices, match,
3095 (GCompareFunc) found_device_cmp);
3102 static int dev_rssi_cmp(struct remote_dev_info *d1, struct remote_dev_info *d2)
3106 rssi1 = d1->rssi < 0 ? -d1->rssi : d1->rssi;
3107 rssi2 = d2->rssi < 0 ? -d2->rssi : d2->rssi;
3109 return rssi1 - rssi2;
3112 static void append_dict_valist(DBusMessageIter *iter,
3113 const char *first_key,
3116 DBusMessageIter dict;
3122 dbus_message_iter_open_container(iter, DBUS_TYPE_ARRAY,
3123 DBUS_DICT_ENTRY_BEGIN_CHAR_AS_STRING
3124 DBUS_TYPE_STRING_AS_STRING DBUS_TYPE_VARIANT_AS_STRING
3125 DBUS_DICT_ENTRY_END_CHAR_AS_STRING, &dict);
3129 type = va_arg(var_args, int);
3130 val = va_arg(var_args, void *);
3131 if (type == DBUS_TYPE_ARRAY) {
3132 n_elements = va_arg(var_args, int);
3134 dict_append_array(&dict, key, DBUS_TYPE_STRING,
3137 dict_append_entry(&dict, key, type, val);
3138 key = va_arg(var_args, char *);
3141 dbus_message_iter_close_container(iter, &dict);
3144 static void emit_device_found(const char *path, const char *address,
3145 const char *first_key, ...)
3147 DBusMessage *signal;
3148 DBusMessageIter iter;
3151 signal = dbus_message_new_signal(path, ADAPTER_INTERFACE,
3154 error("Unable to allocate new %s.DeviceFound signal",
3158 dbus_message_iter_init_append(signal, &iter);
3159 dbus_message_iter_append_basic(&iter, DBUS_TYPE_STRING, &address);
3161 va_start(var_args, first_key);
3162 append_dict_valist(&iter, first_key, var_args);
3165 g_dbus_send_message(connection, signal);
3168 static char **strlist2array(GSList *list)
3177 n = g_slist_length(list);
3178 array = g_new0(char *, n + 1);
3180 for (l = list, i = 0; l; l = l->next, i++)
3181 array[i] = g_strdup((const gchar *) l->data);
3186 void adapter_emit_device_found(struct btd_adapter *adapter,
3187 struct remote_dev_info *dev)
3189 struct btd_device *device;
3190 char peer_addr[18], local_addr[18];
3191 const char *icon, *paddr = peer_addr;
3192 dbus_bool_t paired = FALSE;
3193 dbus_int16_t rssi = dev->rssi;
3197 ba2str(&dev->bdaddr, peer_addr);
3198 ba2str(&adapter->bdaddr, local_addr);
3200 device = adapter_find_device(adapter, paddr);
3202 paired = device_is_paired(device);
3204 /* The uuids string array is updated only if necessary */
3205 uuid_count = g_slist_length(dev->services);
3206 if (dev->services && dev->uuid_count != uuid_count) {
3207 g_strfreev(dev->uuids);
3208 dev->uuids = strlist2array(dev->services);
3209 dev->uuid_count = uuid_count;
3213 gboolean broadcaster;
3215 if (dev->flags & (EIR_LIM_DISC | EIR_GEN_DISC))
3216 broadcaster = FALSE;
3220 emit_device_found(adapter->path, paddr,
3221 "Address", DBUS_TYPE_STRING, &paddr,
3222 "RSSI", DBUS_TYPE_INT16, &rssi,
3223 "Name", DBUS_TYPE_STRING, &dev->name,
3224 "Paired", DBUS_TYPE_BOOLEAN, &paired,
3225 "Broadcaster", DBUS_TYPE_BOOLEAN, &broadcaster,
3226 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
3231 icon = class_to_icon(dev->class);
3235 alias = g_strdup(peer_addr);
3236 g_strdelimit(alias, ":", '-');
3238 alias = g_strdup(dev->name);
3240 alias = g_strdup(dev->alias);
3242 emit_device_found(adapter->path, paddr,
3243 "Address", DBUS_TYPE_STRING, &paddr,
3244 "Class", DBUS_TYPE_UINT32, &dev->class,
3245 "Icon", DBUS_TYPE_STRING, &icon,
3246 "RSSI", DBUS_TYPE_INT16, &rssi,
3247 "Name", DBUS_TYPE_STRING, &dev->name,
3248 "Alias", DBUS_TYPE_STRING, &alias,
3249 "LegacyPairing", DBUS_TYPE_BOOLEAN, &dev->legacy,
3250 "Paired", DBUS_TYPE_BOOLEAN, &paired,
3251 "UUIDs", DBUS_TYPE_ARRAY, &dev->uuids, uuid_count,
3257 static struct remote_dev_info *get_found_dev(struct btd_adapter *adapter,
3258 const bdaddr_t *bdaddr,
3261 struct remote_dev_info *dev, match;
3263 memset(&match, 0, sizeof(struct remote_dev_info));
3264 bacpy(&match.bdaddr, bdaddr);
3265 match.name_status = NAME_ANY;
3267 dev = adapter_search_found_devices(adapter, &match);
3270 /* Out of range list update */
3271 adapter->oor_devices = g_slist_remove(adapter->oor_devices,
3275 dev = g_new0(struct remote_dev_info, 1);
3276 bacpy(&dev->bdaddr, bdaddr);
3277 adapter->found_devices = g_slist_prepend(adapter->found_devices,
3284 static void remove_same_uuid(gpointer data, gpointer user_data)
3286 struct remote_dev_info *dev = user_data;
3289 for (l = dev->services; l; l = l->next) {
3290 char *current_uuid = l->data;
3291 char *new_uuid = data;
3293 if (strcmp(current_uuid, new_uuid) == 0) {
3294 g_free(current_uuid);
3295 dev->services = g_slist_delete_link(dev->services, l);
3301 static void dev_prepend_uuid(gpointer data, gpointer user_data)
3303 struct remote_dev_info *dev = user_data;
3304 char *new_uuid = data;
3306 dev->services = g_slist_prepend(dev->services, g_strdup(new_uuid));
3309 void adapter_update_device_from_info(struct btd_adapter *adapter,
3310 bdaddr_t bdaddr, int8_t rssi,
3311 uint8_t evt_type, const char *name,
3312 GSList *services, int flags)
3314 struct remote_dev_info *dev;
3317 dev = get_found_dev(adapter, &bdaddr, &new_dev);
3321 dev->evt_type = evt_type;
3322 } else if (dev->rssi == rssi)
3327 adapter->found_devices = g_slist_sort(adapter->found_devices,
3328 (GCompareFunc) dev_rssi_cmp);
3330 g_slist_foreach(services, remove_same_uuid, dev);
3331 g_slist_foreach(services, dev_prepend_uuid, dev);
3338 dev->name = g_strdup(name);
3341 /* FIXME: check if other information was changed before emitting the
3343 adapter_emit_device_found(adapter, dev);
3346 void adapter_update_found_devices(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3347 int8_t rssi, uint32_t class, const char *name,
3348 const char *alias, gboolean legacy,
3349 GSList *services, name_status_t name_status)
3351 struct remote_dev_info *dev;
3354 dev = get_found_dev(adapter, bdaddr, &new_dev);
3358 dev->name = g_strdup(name);
3361 dev->alias = g_strdup(alias);
3365 dev->legacy = legacy;
3366 dev->name_status = name_status;
3367 } else if (dev->rssi == rssi)
3372 adapter->found_devices = g_slist_sort(adapter->found_devices,
3373 (GCompareFunc) dev_rssi_cmp);
3375 g_slist_foreach(services, remove_same_uuid, dev);
3376 g_slist_foreach(services, dev_prepend_uuid, dev);
3378 adapter_emit_device_found(adapter, dev);
3381 int adapter_remove_found_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3383 struct remote_dev_info *dev, match;
3385 memset(&match, 0, sizeof(struct remote_dev_info));
3386 bacpy(&match.bdaddr, bdaddr);
3388 dev = adapter_search_found_devices(adapter, &match);
3392 dev->name_status = NAME_NOT_REQUIRED;
3397 void adapter_mode_changed(struct btd_adapter *adapter, uint8_t scan_mode)
3399 const gchar *path = adapter_get_path(adapter);
3400 gboolean discoverable, pairable;
3402 DBG("old 0x%02x new 0x%02x", adapter->scan_mode, scan_mode);
3403 #ifdef __TIZEN_PATCH__
3407 if (adapter->scan_mode == scan_mode)
3410 adapter_remove_discov_timeout(adapter);
3412 switch (scan_mode) {
3414 adapter->mode = MODE_OFF;
3415 discoverable = FALSE;
3417 #ifdef __TIZEN_PATCH__
3422 adapter->mode = MODE_CONNECTABLE;
3423 discoverable = FALSE;
3424 pairable = adapter->pairable;
3425 #ifdef __TIZEN_PATCH__
3429 case (SCAN_PAGE | SCAN_INQUIRY):
3430 adapter->mode = MODE_DISCOVERABLE;
3431 discoverable = TRUE;
3432 pairable = adapter->pairable;
3433 if (adapter->discov_timeout != 0)
3434 adapter_set_discov_timeout(adapter,
3435 adapter->discov_timeout);
3438 /* Address the scenario where a low-level application like
3439 * hciconfig changed the scan mode */
3440 if (adapter->discov_timeout != 0)
3441 adapter_set_discov_timeout(adapter,
3442 adapter->discov_timeout);
3444 /* ignore, this event should not be sent */
3446 /* ignore, reserved */
3450 /* If page scanning gets toggled emit the Pairable property */
3451 if ((adapter->scan_mode & SCAN_PAGE) != (scan_mode & SCAN_PAGE))
3452 emit_property_changed(connection, adapter->path,
3453 ADAPTER_INTERFACE, "Pairable",
3454 DBUS_TYPE_BOOLEAN, &pairable);
3457 adapter_set_limited_discoverable(adapter, FALSE);
3459 emit_property_changed(connection, path,
3460 ADAPTER_INTERFACE, "Discoverable",
3461 DBUS_TYPE_BOOLEAN, &discoverable);
3463 adapter->scan_mode = scan_mode;
3465 set_mode_complete(adapter);
3468 struct agent *adapter_get_agent(struct btd_adapter *adapter)
3470 if (!adapter || !adapter->agent)
3473 return adapter->agent;
3476 void adapter_add_connection(struct btd_adapter *adapter,
3477 struct btd_device *device)
3479 if (g_slist_find(adapter->connections, device)) {
3480 error("Device is already marked as connected");
3484 device_add_connection(device, connection);
3486 adapter->connections = g_slist_append(adapter->connections, device);
3489 void adapter_remove_connection(struct btd_adapter *adapter,
3490 struct btd_device *device)
3496 if (!g_slist_find(adapter->connections, device)) {
3497 error("No matching connection for device");
3501 device_remove_connection(device, connection);
3503 adapter->connections = g_slist_remove(adapter->connections, device);
3505 /* clean pending HCI cmds */
3506 device_get_address(device, &bdaddr);
3508 if (device_is_authenticating(device))
3509 device_cancel_authentication(device, TRUE);
3511 if (device_is_temporary(device)) {
3512 const char *path = device_get_path(device);
3514 DBG("Removing temporary device %s", path);
3515 adapter_remove_device(connection, adapter, device, TRUE);
3519 gboolean adapter_has_discov_sessions(struct btd_adapter *adapter)
3521 if (!adapter || !adapter->disc_sessions)
3527 void adapter_suspend_discovery(struct btd_adapter *adapter)
3529 if (adapter->disc_sessions == NULL ||
3530 adapter->state & STATE_SUSPENDED)
3533 DBG("Suspending discovery");
3535 stop_discovery(adapter, TRUE);
3536 adapter->state |= STATE_SUSPENDED;
3539 void adapter_resume_discovery(struct btd_adapter *adapter)
3541 if (adapter->disc_sessions == NULL)
3544 DBG("Resuming discovery");
3546 adapter->state &= ~STATE_SUSPENDED;
3547 start_discovery(adapter);
3550 int btd_register_adapter_driver(struct btd_adapter_driver *driver)
3552 adapter_drivers = g_slist_append(adapter_drivers, driver);
3554 if (driver->probe == NULL)
3557 manager_foreach_adapter(probe_driver, driver);
3562 static void unload_driver(struct btd_adapter *adapter, gpointer data)
3564 adapter->loaded_drivers = g_slist_remove(adapter->loaded_drivers, data);
3567 void btd_unregister_adapter_driver(struct btd_adapter_driver *driver)
3569 adapter_drivers = g_slist_remove(adapter_drivers, driver);
3571 manager_foreach_adapter(unload_driver, driver);
3574 static void agent_auth_cb(struct agent *agent, DBusError *derr,
3577 struct service_auth *auth = user_data;
3579 device_set_authorizing(auth->device, FALSE);
3581 auth->cb(derr, auth->user_data);
3584 static gboolean auth_idle_cb(gpointer user_data)
3586 struct service_auth *auth = user_data;
3587 struct btd_adapter *adapter = auth->adapter;
3589 adapter->auth_idle_id = 0;
3591 auth->cb(NULL, auth->user_data);
3596 static int adapter_authorize(struct btd_adapter *adapter, const bdaddr_t *dst,
3597 const char *uuid, service_auth_cb cb,
3600 struct service_auth *auth;
3601 struct btd_device *device;
3602 struct agent *agent;
3604 const gchar *dev_path;
3607 ba2str(dst, address);
3608 device = adapter_find_device(adapter, address);
3612 /* Device connected? */
3613 if (!g_slist_find(adapter->connections, device))
3616 if (adapter->auth_idle_id)
3619 auth = g_try_new0(struct service_auth, 1);
3624 auth->user_data = user_data;
3625 auth->device = device;
3626 auth->adapter = adapter;
3628 if (device_is_trusted(device) == TRUE) {
3629 adapter->auth_idle_id = g_idle_add_full(G_PRIORITY_DEFAULT_IDLE,
3635 agent = device_get_agent(device);
3641 dev_path = device_get_path(device);
3643 err = agent_authorize(agent, dev_path, uuid, agent_auth_cb, auth, g_free);
3647 device_set_authorizing(device, TRUE);
3652 int btd_request_authorization(const bdaddr_t *src, const bdaddr_t *dst,
3653 const char *uuid, service_auth_cb cb,
3656 struct btd_adapter *adapter;
3659 if (bacmp(src, BDADDR_ANY) != 0) {
3660 adapter = manager_find_adapter(src);
3664 return adapter_authorize(adapter, dst, uuid, cb, user_data);
3667 for (l = manager_get_adapters(); l != NULL; l = g_slist_next(l)) {
3672 err = adapter_authorize(adapter, dst, uuid, cb, user_data);
3680 int btd_cancel_authorization(const bdaddr_t *src, const bdaddr_t *dst)
3682 struct btd_adapter *adapter = manager_find_adapter(src);
3683 struct btd_device *device;
3684 struct agent *agent;
3691 ba2str(dst, address);
3692 device = adapter_find_device(adapter, address);
3696 if (adapter->auth_idle_id) {
3697 g_source_remove(adapter->auth_idle_id);
3698 adapter->auth_idle_id = 0;
3703 * FIXME: Cancel fails if authorization is requested to adapter's
3704 * agent and in the meanwhile CreatePairedDevice is called.
3707 agent = device_get_agent(device);
3711 err = agent_cancel(agent);
3714 device_set_authorizing(device, FALSE);
3719 static gchar *adapter_any_path = NULL;
3720 static int adapter_any_refcount = 0;
3722 const char *adapter_any_get_path(void)
3724 return adapter_any_path;
3727 const char *btd_adapter_any_request_path(void)
3729 if (adapter_any_refcount++ > 0)
3730 return adapter_any_path;
3732 adapter_any_path = g_strdup_printf("%s/any", manager_get_base_path());
3734 return adapter_any_path;
3737 void btd_adapter_any_release_path(void)
3739 adapter_any_refcount--;
3741 if (adapter_any_refcount > 0)
3744 g_free(adapter_any_path);
3745 adapter_any_path = NULL;
3748 gboolean adapter_is_pairable(struct btd_adapter *adapter)
3750 return adapter->pairable;
3753 gboolean adapter_powering_down(struct btd_adapter *adapter)
3755 return adapter->off_requested;
3758 int btd_adapter_restore_powered(struct btd_adapter *adapter)
3760 char mode[14], address[18];
3761 gboolean discoverable;
3766 if (!main_opts.remember_powered)
3772 ba2str(&adapter->bdaddr, address);
3773 if (read_device_mode(address, mode, sizeof(mode)) == 0 &&
3774 g_str_equal(mode, "off"))
3777 discoverable = get_mode(&adapter->bdaddr, mode) == MODE_DISCOVERABLE;
3779 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3782 int btd_adapter_switch_online(struct btd_adapter *adapter)
3790 return adapter_ops->set_powered(adapter->dev_id, TRUE);
3793 int btd_adapter_switch_offline(struct btd_adapter *adapter)
3801 return adapter_ops->set_powered(adapter->dev_id, FALSE);
3804 int btd_register_adapter_ops(struct btd_adapter_ops *ops, gboolean priority)
3806 if (ops->setup == NULL)
3810 ops_candidates = g_slist_prepend(ops_candidates, ops);
3812 ops_candidates = g_slist_append(ops_candidates, ops);
3817 void btd_adapter_cleanup_ops(struct btd_adapter_ops *ops)
3819 ops_candidates = g_slist_remove(ops_candidates, ops);
3822 if (adapter_ops == ops)
3826 int adapter_ops_setup(void)
3831 if (!ops_candidates)
3834 for (l = ops_candidates; l != NULL; l = g_slist_next(l)) {
3835 struct btd_adapter_ops *ops = l->data;
3848 void btd_adapter_register_powered_callback(struct btd_adapter *adapter,
3849 btd_adapter_powered_cb cb)
3851 adapter->powered_callbacks =
3852 g_slist_append(adapter->powered_callbacks, cb);
3855 void btd_adapter_unregister_powered_callback(struct btd_adapter *adapter,
3856 btd_adapter_powered_cb cb)
3858 adapter->powered_callbacks =
3859 g_slist_remove(adapter->powered_callbacks, cb);
3862 int btd_adapter_set_fast_connectable(struct btd_adapter *adapter,
3871 return adapter_ops->set_fast_connectable(adapter->dev_id, enable);
3874 int btd_adapter_read_clock(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3875 int which, int timeout, uint32_t *clock,
3884 return adapter_ops->read_clock(adapter->dev_id, bdaddr, which,
3885 timeout, clock, accuracy);
3888 int btd_adapter_disconnect_device(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3890 return adapter_ops->disconnect(adapter->dev_id, bdaddr);
3893 int btd_adapter_remove_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3895 return adapter_ops->remove_bonding(adapter->dev_id, bdaddr);
3898 int btd_adapter_pincode_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3901 return adapter_ops->pincode_reply(adapter->dev_id, bdaddr, pin);
3904 int btd_adapter_confirm_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3907 return adapter_ops->confirm_reply(adapter->dev_id, bdaddr, success);
3910 int btd_adapter_passkey_reply(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3913 return adapter_ops->passkey_reply(adapter->dev_id, bdaddr, passkey);
3916 void btd_adapter_update_local_ext_features(struct btd_adapter *adapter,
3917 const uint8_t *features)
3919 struct hci_dev *dev = &adapter->dev;
3921 memcpy(dev->extfeatures, features, 8);
3924 int btd_adapter_encrypt_link(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3925 bt_hci_result_t cb, gpointer user_data)
3927 return adapter_ops->encrypt_link(adapter->dev_id, bdaddr, cb, user_data);
3930 int btd_adapter_set_did(struct btd_adapter *adapter, uint16_t vendor,
3931 uint16_t product, uint16_t version)
3933 return adapter_ops->set_did(adapter->dev_id, vendor, product, version);
3936 int adapter_create_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr,
3939 return adapter_ops->create_bonding(adapter->dev_id, bdaddr, io_cap);
3942 int adapter_cancel_bonding(struct btd_adapter *adapter, bdaddr_t *bdaddr)
3944 return adapter_ops->cancel_bonding(adapter->dev_id, bdaddr);