blob: 74cd755b38a7f53c7b5c450b8d04dd20b02b663b [file] [log] [blame]
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +09001/*
Linus Torvalds1da177e2005-04-16 15:20:36 -07002 BlueZ - Bluetooth protocol stack for Linux
Ron Shaffer2d0a0342010-05-28 11:53:46 -04003 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
Linus Torvalds1da177e2005-04-16 15:20:36 -07004
5 Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>
6
7 This program is free software; you can redistribute it and/or modify
8 it under the terms of the GNU General Public License version 2 as
9 published by the Free Software Foundation;
10
11 THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
12 OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
13 FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
14 IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090015 CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
16 WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
Linus Torvalds1da177e2005-04-16 15:20:36 -070018 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +090020 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
Linus Torvalds1da177e2005-04-16 15:20:36 -070022 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI connection handling. */
26
Linus Torvalds1da177e2005-04-16 15:20:36 -070027#include <linux/module.h>
28
29#include <linux/types.h>
30#include <linux/errno.h>
31#include <linux/kernel.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070032#include <linux/slab.h>
33#include <linux/poll.h>
34#include <linux/fcntl.h>
35#include <linux/init.h>
36#include <linux/skbuff.h>
37#include <linux/interrupt.h>
38#include <linux/notifier.h>
39#include <net/sock.h>
40
41#include <asm/system.h>
Andrei Emeltchenko70f230202010-12-01 16:58:25 +020042#include <linux/uaccess.h>
Linus Torvalds1da177e2005-04-16 15:20:36 -070043#include <asm/unaligned.h>
44
45#include <net/bluetooth/bluetooth.h>
46#include <net/bluetooth/hci_core.h>
47
Ville Tervofcd89c02011-02-10 22:38:47 -030048static void hci_le_connect(struct hci_conn *conn)
49{
50 struct hci_dev *hdev = conn->hdev;
51 struct hci_cp_le_create_conn cp;
52
53 conn->state = BT_CONNECT;
54 conn->out = 1;
Vinicius Costa Gomesb92a6222011-02-10 22:38:52 -030055 conn->link_mode |= HCI_LM_MASTER;
Ville Tervofcd89c02011-02-10 22:38:47 -030056
57 memset(&cp, 0, sizeof(cp));
58 cp.scan_interval = cpu_to_le16(0x0004);
59 cp.scan_window = cpu_to_le16(0x0004);
60 bacpy(&cp.peer_addr, &conn->dst);
61 cp.conn_interval_min = cpu_to_le16(0x0008);
62 cp.conn_interval_max = cpu_to_le16(0x0100);
63 cp.supervision_timeout = cpu_to_le16(0x0064);
64 cp.min_ce_len = cpu_to_le16(0x0001);
65 cp.max_ce_len = cpu_to_le16(0x0001);
66
67 hci_send_cmd(hdev, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
68}
69
70static void hci_le_connect_cancel(struct hci_conn *conn)
71{
72 hci_send_cmd(conn->hdev, HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
73}
74
Marcel Holtmann4c67bc72006-10-15 17:30:56 +020075void hci_acl_connect(struct hci_conn *conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -070076{
77 struct hci_dev *hdev = conn->hdev;
78 struct inquiry_entry *ie;
79 struct hci_cp_create_conn cp;
80
81 BT_DBG("%p", conn);
82
83 conn->state = BT_CONNECT;
Marcel Holtmanna8746412008-07-14 20:13:46 +020084 conn->out = 1;
85
Linus Torvalds1da177e2005-04-16 15:20:36 -070086 conn->link_mode = HCI_LM_MASTER;
87
Marcel Holtmann4c67bc72006-10-15 17:30:56 +020088 conn->attempt++;
89
Marcel Holtmanne4e8e372008-07-14 20:13:47 +020090 conn->link_policy = hdev->link_policy;
91
Linus Torvalds1da177e2005-04-16 15:20:36 -070092 memset(&cp, 0, sizeof(cp));
93 bacpy(&cp.bdaddr, &conn->dst);
94 cp.pscan_rep_mode = 0x02;
95
Andrei Emeltchenko70f230202010-12-01 16:58:25 +020096 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
97 if (ie) {
Marcel Holtmann41a96212008-07-14 20:13:48 +020098 if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
99 cp.pscan_rep_mode = ie->data.pscan_rep_mode;
100 cp.pscan_mode = ie->data.pscan_mode;
101 cp.clock_offset = ie->data.clock_offset |
102 cpu_to_le16(0x8000);
103 }
104
Linus Torvalds1da177e2005-04-16 15:20:36 -0700105 memcpy(conn->dev_class, ie->data.dev_class, 3);
Marcel Holtmann41a96212008-07-14 20:13:48 +0200106 conn->ssp_mode = ie->data.ssp_mode;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700107 }
108
Marcel Holtmanna8746412008-07-14 20:13:46 +0200109 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700110 if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200111 cp.role_switch = 0x01;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700112 else
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200113 cp.role_switch = 0x00;
Marcel Holtmann4c67bc72006-10-15 17:30:56 +0200114
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200115 hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700116}
117
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200118static void hci_acl_connect_cancel(struct hci_conn *conn)
119{
120 struct hci_cp_create_conn_cancel cp;
121
122 BT_DBG("%p", conn);
123
124 if (conn->hdev->hci_ver < 2)
125 return;
126
127 bacpy(&cp.bdaddr, &conn->dst);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200128 hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp);
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200129}
130
Linus Torvalds1da177e2005-04-16 15:20:36 -0700131void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
132{
133 struct hci_cp_disconnect cp;
134
135 BT_DBG("%p", conn);
136
137 conn->state = BT_DISCONN;
138
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700139 cp.handle = cpu_to_le16(conn->handle);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700140 cp.reason = reason;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200141 hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700142}
143
144void hci_add_sco(struct hci_conn *conn, __u16 handle)
145{
146 struct hci_dev *hdev = conn->hdev;
147 struct hci_cp_add_sco cp;
148
149 BT_DBG("%p", conn);
150
151 conn->state = BT_CONNECT;
152 conn->out = 1;
153
Marcel Holtmannefc76882009-02-06 09:13:37 +0100154 conn->attempt++;
155
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700156 cp.handle = cpu_to_le16(handle);
Marcel Holtmanna8746412008-07-14 20:13:46 +0200157 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700158
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200159 hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700160}
161
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200162void hci_setup_sync(struct hci_conn *conn, __u16 handle)
163{
164 struct hci_dev *hdev = conn->hdev;
165 struct hci_cp_setup_sync_conn cp;
166
167 BT_DBG("%p", conn);
168
169 conn->state = BT_CONNECT;
170 conn->out = 1;
171
Marcel Holtmannefc76882009-02-06 09:13:37 +0100172 conn->attempt++;
173
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200174 cp.handle = cpu_to_le16(handle);
Marcel Holtmanna8746412008-07-14 20:13:46 +0200175 cp.pkt_type = cpu_to_le16(conn->pkt_type);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200176
177 cp.tx_bandwidth = cpu_to_le32(0x00001f40);
178 cp.rx_bandwidth = cpu_to_le32(0x00001f40);
179 cp.max_latency = cpu_to_le16(0xffff);
180 cp.voice_setting = cpu_to_le16(hdev->voice_setting);
181 cp.retrans_effort = 0xff;
182
183 hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp);
184}
185
Claudio Takahasi2ce603e2011-02-16 20:44:53 -0200186void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
187 u16 latency, u16 to_multiplier)
188{
189 struct hci_cp_le_conn_update cp;
190 struct hci_dev *hdev = conn->hdev;
191
192 memset(&cp, 0, sizeof(cp));
193
194 cp.handle = cpu_to_le16(conn->handle);
195 cp.conn_interval_min = cpu_to_le16(min);
196 cp.conn_interval_max = cpu_to_le16(max);
197 cp.conn_latency = cpu_to_le16(latency);
198 cp.supervision_timeout = cpu_to_le16(to_multiplier);
199 cp.min_ce_len = cpu_to_le16(0x0001);
200 cp.max_ce_len = cpu_to_le16(0x0001);
201
202 hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp);
203}
204EXPORT_SYMBOL(hci_le_conn_update);
205
Marcel Holtmanne73439d2010-07-26 10:06:00 -0400206/* Device _must_ be locked */
207void hci_sco_setup(struct hci_conn *conn, __u8 status)
208{
209 struct hci_conn *sco = conn->link;
210
211 BT_DBG("%p", conn);
212
213 if (!sco)
214 return;
215
216 if (!status) {
217 if (lmp_esco_capable(conn->hdev))
218 hci_setup_sync(sco, conn->handle);
219 else
220 hci_add_sco(sco, conn->handle);
221 } else {
222 hci_proto_connect_cfm(sco, status);
223 hci_conn_del(sco);
224 }
225}
226
Linus Torvalds1da177e2005-04-16 15:20:36 -0700227static void hci_conn_timeout(unsigned long arg)
228{
Marcel Holtmann04837f62006-07-03 10:02:33 +0200229 struct hci_conn *conn = (void *) arg;
230 struct hci_dev *hdev = conn->hdev;
Marcel Holtmann2950f212009-02-12 14:02:50 +0100231 __u8 reason;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700232
233 BT_DBG("conn %p state %d", conn, conn->state);
234
235 if (atomic_read(&conn->refcnt))
236 return;
237
238 hci_dev_lock(hdev);
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200239
240 switch (conn->state) {
241 case BT_CONNECT:
Marcel Holtmann769be972008-07-14 20:13:49 +0200242 case BT_CONNECT2:
Ville Tervofcd89c02011-02-10 22:38:47 -0300243 if (conn->out) {
244 if (conn->type == ACL_LINK)
245 hci_acl_connect_cancel(conn);
246 else if (conn->type == LE_LINK)
247 hci_le_connect_cancel(conn);
248 }
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200249 break;
Marcel Holtmann769be972008-07-14 20:13:49 +0200250 case BT_CONFIG:
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900251 case BT_CONNECTED:
Marcel Holtmann2950f212009-02-12 14:02:50 +0100252 reason = hci_proto_disconn_ind(conn);
253 hci_acl_disconn(conn, reason);
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200254 break;
255 default:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700256 conn->state = BT_CLOSED;
Marcel Holtmann6ac59342006-09-26 09:43:48 +0200257 break;
258 }
259
Linus Torvalds1da177e2005-04-16 15:20:36 -0700260 hci_dev_unlock(hdev);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700261}
262
Marcel Holtmann04837f62006-07-03 10:02:33 +0200263static void hci_conn_idle(unsigned long arg)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700264{
Marcel Holtmann04837f62006-07-03 10:02:33 +0200265 struct hci_conn *conn = (void *) arg;
266
267 BT_DBG("conn %p mode %d", conn, conn->mode);
268
269 hci_conn_enter_sniff_mode(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700270}
271
272struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
273{
274 struct hci_conn *conn;
275
276 BT_DBG("%s dst %s", hdev->name, batostr(dst));
277
Marcel Holtmann04837f62006-07-03 10:02:33 +0200278 conn = kzalloc(sizeof(struct hci_conn), GFP_ATOMIC);
279 if (!conn)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700280 return NULL;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700281
282 bacpy(&conn->dst, dst);
Marcel Holtmanna8746412008-07-14 20:13:46 +0200283 conn->hdev = hdev;
284 conn->type = type;
285 conn->mode = HCI_CM_ACTIVE;
286 conn->state = BT_OPEN;
Andrei Emeltchenko93f19c92009-09-03 12:34:19 +0300287 conn->auth_type = HCI_AT_GENERAL_BONDING;
Johan Hedberg17fa4b92011-01-25 13:28:33 +0200288 conn->io_capability = hdev->io_capability;
Johan Hedberga9583552011-02-19 12:06:01 -0300289 conn->remote_auth = 0xff;
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200290 conn->key_type = 0xff;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700291
Marcel Holtmann04837f62006-07-03 10:02:33 +0200292 conn->power_save = 1;
Marcel Holtmann052b30b2009-04-26 20:01:22 +0200293 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
Marcel Holtmann04837f62006-07-03 10:02:33 +0200294
Marcel Holtmanna8746412008-07-14 20:13:46 +0200295 switch (type) {
296 case ACL_LINK:
297 conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
298 break;
299 case SCO_LINK:
300 if (lmp_esco_capable(hdev))
Marcel Holtmannefc76882009-02-06 09:13:37 +0100301 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
302 (hdev->esco_type & EDR_ESCO_MASK);
Marcel Holtmanna8746412008-07-14 20:13:46 +0200303 else
304 conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
305 break;
306 case ESCO_LINK:
Marcel Holtmannefc76882009-02-06 09:13:37 +0100307 conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
Marcel Holtmanna8746412008-07-14 20:13:46 +0200308 break;
309 }
310
Linus Torvalds1da177e2005-04-16 15:20:36 -0700311 skb_queue_head_init(&conn->data_q);
Marcel Holtmann04837f62006-07-03 10:02:33 +0200312
Pavel Emelyanovb24b8a22008-01-23 21:20:07 -0800313 setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn);
314 setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700315
316 atomic_set(&conn->refcnt, 0);
317
318 hci_dev_hold(hdev);
319
320 tasklet_disable(&hdev->tx_task);
321
322 hci_conn_hash_add(hdev, conn);
323 if (hdev->notify)
324 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
325
Marcel Holtmann9eba32b2009-08-22 14:19:26 -0700326 atomic_set(&conn->devref, 0);
327
Marcel Holtmanna67e8992009-05-02 18:24:06 -0700328 hci_conn_init_sysfs(conn);
329
Linus Torvalds1da177e2005-04-16 15:20:36 -0700330 tasklet_enable(&hdev->tx_task);
331
332 return conn;
333}
334
335int hci_conn_del(struct hci_conn *conn)
336{
337 struct hci_dev *hdev = conn->hdev;
338
339 BT_DBG("%s conn %p handle %d", hdev->name, conn, conn->handle);
340
Marcel Holtmann04837f62006-07-03 10:02:33 +0200341 del_timer(&conn->idle_timer);
342
343 del_timer(&conn->disc_timer);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700344
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200345 if (conn->type == ACL_LINK) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700346 struct hci_conn *sco = conn->link;
347 if (sco)
348 sco->link = NULL;
349
350 /* Unacked frames */
351 hdev->acl_cnt += conn->sent;
Ville Tervo6ed58ec2011-02-10 22:38:48 -0300352 } else if (conn->type == LE_LINK) {
353 if (hdev->le_pkts)
354 hdev->le_cnt += conn->sent;
355 else
356 hdev->acl_cnt += conn->sent;
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200357 } else {
358 struct hci_conn *acl = conn->link;
359 if (acl) {
360 acl->link = NULL;
361 hci_conn_put(acl);
362 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700363 }
364
365 tasklet_disable(&hdev->tx_task);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +0200366
Linus Torvalds1da177e2005-04-16 15:20:36 -0700367 hci_conn_hash_del(hdev, conn);
368 if (hdev->notify)
369 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +0200370
Linus Torvalds1da177e2005-04-16 15:20:36 -0700371 tasklet_enable(&hdev->tx_task);
Marcel Holtmann7d0db0a2008-07-14 20:13:51 +0200372
Linus Torvalds1da177e2005-04-16 15:20:36 -0700373 skb_queue_purge(&conn->data_q);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700374
Marcel Holtmann9eba32b2009-08-22 14:19:26 -0700375 hci_conn_put_device(conn);
Dave Young2ae9a6b2009-02-21 16:13:34 +0800376
Marcel Holtmann384943e2009-05-08 18:20:43 -0700377 hci_dev_put(hdev);
378
Linus Torvalds1da177e2005-04-16 15:20:36 -0700379 return 0;
380}
381
382struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
383{
384 int use_src = bacmp(src, BDADDR_ANY);
385 struct hci_dev *hdev = NULL;
386 struct list_head *p;
387
388 BT_DBG("%s -> %s", batostr(src), batostr(dst));
389
390 read_lock_bh(&hci_dev_list_lock);
391
392 list_for_each(p, &hci_dev_list) {
393 struct hci_dev *d = list_entry(p, struct hci_dev, list);
394
395 if (!test_bit(HCI_UP, &d->flags) || test_bit(HCI_RAW, &d->flags))
396 continue;
397
YOSHIFUJI Hideaki8e87d142007-02-09 23:24:33 +0900398 /* Simple routing:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700399 * No source address - find interface with bdaddr != dst
400 * Source address - find interface with bdaddr == src
401 */
402
403 if (use_src) {
404 if (!bacmp(&d->bdaddr, src)) {
405 hdev = d; break;
406 }
407 } else {
408 if (bacmp(&d->bdaddr, dst)) {
409 hdev = d; break;
410 }
411 }
412 }
413
414 if (hdev)
415 hdev = hci_dev_hold(hdev);
416
417 read_unlock_bh(&hci_dev_list_lock);
418 return hdev;
419}
420EXPORT_SYMBOL(hci_get_route);
421
Ville Tervofcd89c02011-02-10 22:38:47 -0300422/* Create SCO, ACL or LE connection.
Linus Torvalds1da177e2005-04-16 15:20:36 -0700423 * Device _must_ be locked */
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100424struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700425{
426 struct hci_conn *acl;
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200427 struct hci_conn *sco;
Ville Tervofcd89c02011-02-10 22:38:47 -0300428 struct hci_conn *le;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700429
430 BT_DBG("%s dst %s", hdev->name, batostr(dst));
431
Ville Tervofcd89c02011-02-10 22:38:47 -0300432 if (type == LE_LINK) {
433 le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
Anderson Briglia15c47942011-02-21 15:09:23 -0300434 if (le)
Ville Tervo30e76272011-02-22 16:10:53 -0300435 return ERR_PTR(-EBUSY);
Anderson Briglia15c47942011-02-21 15:09:23 -0300436 le = hci_conn_add(hdev, LE_LINK, dst);
Ville Tervofcd89c02011-02-10 22:38:47 -0300437 if (!le)
Ville Tervo30e76272011-02-22 16:10:53 -0300438 return ERR_PTR(-ENOMEM);
Ville Tervofcd89c02011-02-10 22:38:47 -0300439 if (le->state == BT_OPEN)
440 hci_le_connect(le);
441
442 hci_conn_hold(le);
443
444 return le;
445 }
446
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200447 acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
448 if (!acl) {
449 acl = hci_conn_add(hdev, ACL_LINK, dst);
450 if (!acl)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700451 return NULL;
452 }
453
454 hci_conn_hold(acl);
455
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200456 if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
Johan Hedberg765c2a92011-01-19 12:06:52 +0530457 acl->sec_level = BT_SECURITY_LOW;
458 acl->pending_sec_level = sec_level;
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200459 acl->auth_type = auth_type;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700460 hci_acl_connect(acl);
Marcel Holtmann09ab6f42008-09-09 07:19:20 +0200461 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700462
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200463 if (type == ACL_LINK)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700464 return acl;
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200465
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200466 sco = hci_conn_hash_lookup_ba(hdev, type, dst);
467 if (!sco) {
468 sco = hci_conn_add(hdev, type, dst);
469 if (!sco) {
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200470 hci_conn_put(acl);
471 return NULL;
472 }
Linus Torvalds1da177e2005-04-16 15:20:36 -0700473 }
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200474
475 acl->link = sco;
476 sco->link = acl;
477
478 hci_conn_hold(sco);
479
480 if (acl->state == BT_CONNECTED &&
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200481 (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
Nick Pellyc3902162009-11-13 14:16:32 -0800482 acl->power_save = 1;
483 hci_conn_enter_active_mode(acl);
484
Marcel Holtmanne73439d2010-07-26 10:06:00 -0400485 if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->pend)) {
486 /* defer SCO setup until mode change completed */
487 set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->pend);
488 return sco;
489 }
490
491 hci_sco_setup(acl, 0x00);
Marcel Holtmannb6a0dc82007-10-20 14:55:10 +0200492 }
Marcel Holtmann5b7f9902007-07-11 09:51:55 +0200493
494 return sco;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700495}
496EXPORT_SYMBOL(hci_connect);
497
Marcel Holtmanne7c29cb2008-09-09 07:19:20 +0200498/* Check link security requirement */
499int hci_conn_check_link_mode(struct hci_conn *conn)
500{
501 BT_DBG("conn %p", conn);
502
503 if (conn->ssp_mode > 0 && conn->hdev->ssp_mode > 0 &&
504 !(conn->link_mode & HCI_LM_ENCRYPT))
505 return 0;
506
507 return 1;
508}
509EXPORT_SYMBOL(hci_conn_check_link_mode);
510
Linus Torvalds1da177e2005-04-16 15:20:36 -0700511/* Authenticate remote device */
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100512static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700513{
514 BT_DBG("conn %p", conn);
515
Johan Hedberg765c2a92011-01-19 12:06:52 +0530516 if (conn->pending_sec_level > sec_level)
517 sec_level = conn->pending_sec_level;
518
Marcel Holtmann96a31832009-02-12 16:23:03 +0100519 if (sec_level > conn->sec_level)
Johan Hedberg765c2a92011-01-19 12:06:52 +0530520 conn->pending_sec_level = sec_level;
Marcel Holtmann96a31832009-02-12 16:23:03 +0100521 else if (conn->link_mode & HCI_LM_AUTH)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700522 return 1;
523
Johan Hedberg65cf6862011-01-19 12:06:49 +0530524 /* Make sure we preserve an existing MITM requirement*/
525 auth_type |= (conn->auth_type & 0x01);
526
Marcel Holtmann96a31832009-02-12 16:23:03 +0100527 conn->auth_type = auth_type;
528
Linus Torvalds1da177e2005-04-16 15:20:36 -0700529 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
530 struct hci_cp_auth_requested cp;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700531 cp.handle = cpu_to_le16(conn->handle);
Marcel Holtmann40be4922008-07-14 20:13:50 +0200532 hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
533 sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700534 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100535
Linus Torvalds1da177e2005-04-16 15:20:36 -0700536 return 0;
537}
Linus Torvalds1da177e2005-04-16 15:20:36 -0700538
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200539/* Encrypt the the link */
540static void hci_conn_encrypt(struct hci_conn *conn)
541{
542 BT_DBG("conn %p", conn);
543
544 if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend)) {
545 struct hci_cp_set_conn_encrypt cp;
546 cp.handle = cpu_to_le16(conn->handle);
547 cp.encrypt = 0x01;
548 hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
549 &cp);
550 }
551}
552
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100553/* Enable security */
Marcel Holtmann0684e5f2009-02-09 02:48:38 +0100554int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700555{
556 BT_DBG("conn %p", conn);
557
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200558 /* For sdp we don't need the link key. */
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100559 if (sec_level == BT_SECURITY_SDP)
560 return 1;
561
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200562 /* For non 2.1 devices and low security level we don't need the link
563 key. */
Marcel Holtmann3fdca1e2009-04-28 09:04:55 -0700564 if (sec_level == BT_SECURITY_LOW &&
565 (!conn->ssp_mode || !conn->hdev->ssp_mode))
566 return 1;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100567
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200568 /* For other security levels we need the link key. */
569 if (!(conn->link_mode & HCI_LM_AUTH))
570 goto auth;
Linus Torvalds1da177e2005-04-16 15:20:36 -0700571
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200572 /* An authenticated combination key has sufficient security for any
573 security level. */
574 if (conn->key_type == HCI_LK_AUTH_COMBINATION)
575 goto encrypt;
576
577 /* An unauthenticated combination key has sufficient security for
578 security level 1 and 2. */
579 if (conn->key_type == HCI_LK_UNAUTH_COMBINATION &&
580 (sec_level == BT_SECURITY_MEDIUM ||
581 sec_level == BT_SECURITY_LOW))
582 goto encrypt;
583
584 /* A combination key has always sufficient security for the security
585 levels 1 or 2. High security level requires the combination key
586 is generated using maximum PIN code length (16).
587 For pre 2.1 units. */
588 if (conn->key_type == HCI_LK_COMBINATION &&
589 (sec_level != BT_SECURITY_HIGH ||
590 conn->pin_length == 16))
591 goto encrypt;
592
593auth:
Linus Torvalds1da177e2005-04-16 15:20:36 -0700594 if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
595 return 0;
596
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200597 hci_conn_auth(conn, sec_level, auth_type);
598 return 0;
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100599
Waldemar Rymarkiewicz13d39312011-04-28 12:07:55 +0200600encrypt:
601 if (conn->link_mode & HCI_LM_ENCRYPT)
602 return 1;
603
604 hci_conn_encrypt(conn);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700605 return 0;
606}
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100607EXPORT_SYMBOL(hci_conn_security);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700608
609/* Change link key */
610int hci_conn_change_link_key(struct hci_conn *conn)
611{
612 BT_DBG("conn %p", conn);
613
614 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
615 struct hci_cp_change_conn_link_key cp;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700616 cp.handle = cpu_to_le16(conn->handle);
Marcel Holtmann40be4922008-07-14 20:13:50 +0200617 hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
618 sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700619 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100620
Linus Torvalds1da177e2005-04-16 15:20:36 -0700621 return 0;
622}
623EXPORT_SYMBOL(hci_conn_change_link_key);
624
625/* Switch role */
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100626int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700627{
628 BT_DBG("conn %p", conn);
629
630 if (!role && conn->link_mode & HCI_LM_MASTER)
631 return 1;
632
633 if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->pend)) {
634 struct hci_cp_switch_role cp;
635 bacpy(&cp.bdaddr, &conn->dst);
636 cp.role = role;
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200637 hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700638 }
Marcel Holtmann8c1b2352009-01-15 21:58:04 +0100639
Linus Torvalds1da177e2005-04-16 15:20:36 -0700640 return 0;
641}
642EXPORT_SYMBOL(hci_conn_switch_role);
643
Marcel Holtmann04837f62006-07-03 10:02:33 +0200644/* Enter active mode */
645void hci_conn_enter_active_mode(struct hci_conn *conn)
646{
647 struct hci_dev *hdev = conn->hdev;
648
649 BT_DBG("conn %p mode %d", conn, conn->mode);
650
651 if (test_bit(HCI_RAW, &hdev->flags))
652 return;
653
654 if (conn->mode != HCI_CM_SNIFF || !conn->power_save)
655 goto timer;
656
657 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) {
658 struct hci_cp_exit_sniff_mode cp;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700659 cp.handle = cpu_to_le16(conn->handle);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200660 hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
Marcel Holtmann04837f62006-07-03 10:02:33 +0200661 }
662
663timer:
664 if (hdev->idle_timeout > 0)
665 mod_timer(&conn->idle_timer,
666 jiffies + msecs_to_jiffies(hdev->idle_timeout));
667}
668
669/* Enter sniff mode */
670void hci_conn_enter_sniff_mode(struct hci_conn *conn)
671{
672 struct hci_dev *hdev = conn->hdev;
673
674 BT_DBG("conn %p mode %d", conn, conn->mode);
675
676 if (test_bit(HCI_RAW, &hdev->flags))
677 return;
678
679 if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn))
680 return;
681
682 if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF))
683 return;
684
685 if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) {
686 struct hci_cp_sniff_subrate cp;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700687 cp.handle = cpu_to_le16(conn->handle);
688 cp.max_latency = cpu_to_le16(0);
689 cp.min_remote_timeout = cpu_to_le16(0);
690 cp.min_local_timeout = cpu_to_le16(0);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200691 hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
Marcel Holtmann04837f62006-07-03 10:02:33 +0200692 }
693
694 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) {
695 struct hci_cp_sniff_mode cp;
YOSHIFUJI Hideakiaca31922007-03-25 20:12:50 -0700696 cp.handle = cpu_to_le16(conn->handle);
697 cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
698 cp.min_interval = cpu_to_le16(hdev->sniff_min_interval);
699 cp.attempt = cpu_to_le16(4);
700 cp.timeout = cpu_to_le16(1);
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200701 hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
Marcel Holtmann04837f62006-07-03 10:02:33 +0200702 }
703}
704
Linus Torvalds1da177e2005-04-16 15:20:36 -0700705/* Drop all connection on the device */
706void hci_conn_hash_flush(struct hci_dev *hdev)
707{
708 struct hci_conn_hash *h = &hdev->conn_hash;
709 struct list_head *p;
710
711 BT_DBG("hdev %s", hdev->name);
712
713 p = h->list.next;
714 while (p != &h->list) {
715 struct hci_conn *c;
716
717 c = list_entry(p, struct hci_conn, list);
718 p = p->next;
719
720 c->state = BT_CLOSED;
721
Marcel Holtmann2950f212009-02-12 14:02:50 +0100722 hci_proto_disconn_cfm(c, 0x16);
Linus Torvalds1da177e2005-04-16 15:20:36 -0700723 hci_conn_del(c);
724 }
725}
726
Marcel Holtmanna9de9242007-10-20 13:33:56 +0200727/* Check pending connect attempts */
728void hci_conn_check_pending(struct hci_dev *hdev)
729{
730 struct hci_conn *conn;
731
732 BT_DBG("hdev %s", hdev->name);
733
734 hci_dev_lock(hdev);
735
736 conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
737 if (conn)
738 hci_acl_connect(conn);
739
740 hci_dev_unlock(hdev);
741}
742
Marcel Holtmann9eba32b2009-08-22 14:19:26 -0700743void hci_conn_hold_device(struct hci_conn *conn)
744{
745 atomic_inc(&conn->devref);
746}
747EXPORT_SYMBOL(hci_conn_hold_device);
748
749void hci_conn_put_device(struct hci_conn *conn)
750{
751 if (atomic_dec_and_test(&conn->devref))
752 hci_conn_del_sysfs(conn);
753}
754EXPORT_SYMBOL(hci_conn_put_device);
755
Linus Torvalds1da177e2005-04-16 15:20:36 -0700756int hci_get_conn_list(void __user *arg)
757{
758 struct hci_conn_list_req req, *cl;
759 struct hci_conn_info *ci;
760 struct hci_dev *hdev;
761 struct list_head *p;
762 int n = 0, size, err;
763
764 if (copy_from_user(&req, arg, sizeof(req)))
765 return -EFAULT;
766
767 if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
768 return -EINVAL;
769
770 size = sizeof(req) + req.conn_num * sizeof(*ci);
771
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200772 cl = kmalloc(size, GFP_KERNEL);
773 if (!cl)
Linus Torvalds1da177e2005-04-16 15:20:36 -0700774 return -ENOMEM;
775
Andrei Emeltchenko70f230202010-12-01 16:58:25 +0200776 hdev = hci_dev_get(req.dev_id);
777 if (!hdev) {
Linus Torvalds1da177e2005-04-16 15:20:36 -0700778 kfree(cl);
779 return -ENODEV;
780 }
781
782 ci = cl->conn_info;
783
784 hci_dev_lock_bh(hdev);
785 list_for_each(p, &hdev->conn_hash.list) {
786 register struct hci_conn *c;
787 c = list_entry(p, struct hci_conn, list);
788
789 bacpy(&(ci + n)->bdaddr, &c->dst);
790 (ci + n)->handle = c->handle;
791 (ci + n)->type = c->type;
792 (ci + n)->out = c->out;
793 (ci + n)->state = c->state;
794 (ci + n)->link_mode = c->link_mode;
795 if (++n >= req.conn_num)
796 break;
797 }
798 hci_dev_unlock_bh(hdev);
799
800 cl->dev_id = hdev->id;
801 cl->conn_num = n;
802 size = sizeof(req) + n * sizeof(*ci);
803
804 hci_dev_put(hdev);
805
806 err = copy_to_user(arg, cl, size);
807 kfree(cl);
808
809 return err ? -EFAULT : 0;
810}
811
812int hci_get_conn_info(struct hci_dev *hdev, void __user *arg)
813{
814 struct hci_conn_info_req req;
815 struct hci_conn_info ci;
816 struct hci_conn *conn;
817 char __user *ptr = arg + sizeof(req);
818
819 if (copy_from_user(&req, arg, sizeof(req)))
820 return -EFAULT;
821
822 hci_dev_lock_bh(hdev);
823 conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
824 if (conn) {
825 bacpy(&ci.bdaddr, &conn->dst);
826 ci.handle = conn->handle;
827 ci.type = conn->type;
828 ci.out = conn->out;
829 ci.state = conn->state;
830 ci.link_mode = conn->link_mode;
831 }
832 hci_dev_unlock_bh(hdev);
833
834 if (!conn)
835 return -ENOENT;
836
837 return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
838}
Marcel Holtmann40be4922008-07-14 20:13:50 +0200839
840int hci_get_auth_info(struct hci_dev *hdev, void __user *arg)
841{
842 struct hci_auth_info_req req;
843 struct hci_conn *conn;
844
845 if (copy_from_user(&req, arg, sizeof(req)))
846 return -EFAULT;
847
848 hci_dev_lock_bh(hdev);
849 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
850 if (conn)
851 req.type = conn->auth_type;
852 hci_dev_unlock_bh(hdev);
853
854 if (!conn)
855 return -ENOENT;
856
857 return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
858}