batman-adv: make batadv_test_bit() return 0 or 1 only
[deliverable/linux.git] / net / bluetooth / hci_conn.c
CommitLineData
8e87d142 1/*
1da177e4 2 BlueZ - Bluetooth protocol stack for Linux
2d0a0346 3 Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
1da177e4
LT
4
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
8e87d142
YH
15 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
1da177e4
LT
18 OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19
8e87d142
YH
20 ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21 COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
1da177e4
LT
22 SOFTWARE IS DISCLAIMED.
23*/
24
25/* Bluetooth HCI connection handling. */
26
8c520a59 27#include <linux/export.h>
1da177e4
LT
28
29#include <net/bluetooth/bluetooth.h>
30#include <net/bluetooth/hci_core.h>
9740e49d 31#include <net/bluetooth/a2mp.h>
d8343f12 32#include <net/bluetooth/smp.h>
1da177e4 33
fcd89c09
VT
34static void hci_le_connect(struct hci_conn *conn)
35{
36 struct hci_dev *hdev = conn->hdev;
37 struct hci_cp_le_create_conn cp;
38
39 conn->state = BT_CONNECT;
a0c808b3 40 conn->out = true;
b92a6223 41 conn->link_mode |= HCI_LM_MASTER;
7b5c0d52 42 conn->sec_level = BT_SECURITY_LOW;
fcd89c09
VT
43
44 memset(&cp, 0, sizeof(cp));
82781e63
AE
45 cp.scan_interval = __constant_cpu_to_le16(0x0060);
46 cp.scan_window = __constant_cpu_to_le16(0x0030);
fcd89c09 47 bacpy(&cp.peer_addr, &conn->dst);
6d3ce0e7 48 cp.peer_addr_type = conn->dst_type;
82781e63
AE
49 cp.conn_interval_min = __constant_cpu_to_le16(0x0028);
50 cp.conn_interval_max = __constant_cpu_to_le16(0x0038);
51 cp.supervision_timeout = __constant_cpu_to_le16(0x002a);
52 cp.min_ce_len = __constant_cpu_to_le16(0x0000);
53 cp.max_ce_len = __constant_cpu_to_le16(0x0000);
fcd89c09
VT
54
55 hci_send_cmd(hdev, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
56}
57
58static void hci_le_connect_cancel(struct hci_conn *conn)
59{
60 hci_send_cmd(conn->hdev, HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
61}
62
4c67bc74 63void hci_acl_connect(struct hci_conn *conn)
1da177e4
LT
64{
65 struct hci_dev *hdev = conn->hdev;
66 struct inquiry_entry *ie;
67 struct hci_cp_create_conn cp;
68
42d2d87c 69 BT_DBG("hcon %p", conn);
1da177e4
LT
70
71 conn->state = BT_CONNECT;
a0c808b3 72 conn->out = true;
a8746417 73
1da177e4
LT
74 conn->link_mode = HCI_LM_MASTER;
75
4c67bc74
MH
76 conn->attempt++;
77
e4e8e37c
MH
78 conn->link_policy = hdev->link_policy;
79
1da177e4
LT
80 memset(&cp, 0, sizeof(cp));
81 bacpy(&cp.bdaddr, &conn->dst);
82 cp.pscan_rep_mode = 0x02;
83
70f23020
AE
84 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
85 if (ie) {
41a96212
MH
86 if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
87 cp.pscan_rep_mode = ie->data.pscan_rep_mode;
88 cp.pscan_mode = ie->data.pscan_mode;
89 cp.clock_offset = ie->data.clock_offset |
82781e63 90 __constant_cpu_to_le16(0x8000);
41a96212
MH
91 }
92
1da177e4 93 memcpy(conn->dev_class, ie->data.dev_class, 3);
58a681ef
JH
94 if (ie->data.ssp_mode > 0)
95 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
1da177e4
LT
96 }
97
a8746417 98 cp.pkt_type = cpu_to_le16(conn->pkt_type);
1da177e4 99 if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
b6a0dc82 100 cp.role_switch = 0x01;
1da177e4 101 else
b6a0dc82 102 cp.role_switch = 0x00;
4c67bc74 103
a9de9248 104 hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
1da177e4
LT
105}
106
6ac59344
MH
107static void hci_acl_connect_cancel(struct hci_conn *conn)
108{
109 struct hci_cp_create_conn_cancel cp;
110
38b3fef1 111 BT_DBG("hcon %p", conn);
6ac59344 112
d095c1eb 113 if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2)
6ac59344
MH
114 return;
115
116 bacpy(&cp.bdaddr, &conn->dst);
a9de9248 117 hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp);
6ac59344
MH
118}
119
1da177e4
LT
120void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
121{
122 struct hci_cp_disconnect cp;
123
38b3fef1 124 BT_DBG("hcon %p", conn);
1da177e4
LT
125
126 conn->state = BT_DISCONN;
127
aca3192c 128 cp.handle = cpu_to_le16(conn->handle);
1da177e4 129 cp.reason = reason;
a9de9248 130 hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
1da177e4
LT
131}
132
133void hci_add_sco(struct hci_conn *conn, __u16 handle)
134{
135 struct hci_dev *hdev = conn->hdev;
136 struct hci_cp_add_sco cp;
137
38b3fef1 138 BT_DBG("hcon %p", conn);
1da177e4
LT
139
140 conn->state = BT_CONNECT;
a0c808b3 141 conn->out = true;
1da177e4 142
efc7688b
MH
143 conn->attempt++;
144
aca3192c 145 cp.handle = cpu_to_le16(handle);
a8746417 146 cp.pkt_type = cpu_to_le16(conn->pkt_type);
1da177e4 147
a9de9248 148 hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
1da177e4
LT
149}
150
b6a0dc82
MH
151void hci_setup_sync(struct hci_conn *conn, __u16 handle)
152{
153 struct hci_dev *hdev = conn->hdev;
154 struct hci_cp_setup_sync_conn cp;
155
38b3fef1 156 BT_DBG("hcon %p", conn);
b6a0dc82
MH
157
158 conn->state = BT_CONNECT;
a0c808b3 159 conn->out = true;
b6a0dc82 160
efc7688b
MH
161 conn->attempt++;
162
b6a0dc82 163 cp.handle = cpu_to_le16(handle);
a8746417 164 cp.pkt_type = cpu_to_le16(conn->pkt_type);
b6a0dc82 165
82781e63
AE
166 cp.tx_bandwidth = __constant_cpu_to_le32(0x00001f40);
167 cp.rx_bandwidth = __constant_cpu_to_le32(0x00001f40);
168 cp.max_latency = __constant_cpu_to_le16(0xffff);
b6a0dc82
MH
169 cp.voice_setting = cpu_to_le16(hdev->voice_setting);
170 cp.retrans_effort = 0xff;
171
172 hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp);
173}
174
2ce603eb 175void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
5974e4c4 176 u16 latency, u16 to_multiplier)
2ce603eb
CT
177{
178 struct hci_cp_le_conn_update cp;
179 struct hci_dev *hdev = conn->hdev;
180
181 memset(&cp, 0, sizeof(cp));
182
183 cp.handle = cpu_to_le16(conn->handle);
184 cp.conn_interval_min = cpu_to_le16(min);
185 cp.conn_interval_max = cpu_to_le16(max);
186 cp.conn_latency = cpu_to_le16(latency);
187 cp.supervision_timeout = cpu_to_le16(to_multiplier);
82781e63
AE
188 cp.min_ce_len = __constant_cpu_to_le16(0x0001);
189 cp.max_ce_len = __constant_cpu_to_le16(0x0001);
2ce603eb
CT
190
191 hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp);
192}
2ce603eb 193
a7a595f6 194void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
5974e4c4 195 __u8 ltk[16])
a7a595f6
VCG
196{
197 struct hci_dev *hdev = conn->hdev;
198 struct hci_cp_le_start_enc cp;
199
38b3fef1 200 BT_DBG("hcon %p", conn);
a7a595f6
VCG
201
202 memset(&cp, 0, sizeof(cp));
203
204 cp.handle = cpu_to_le16(conn->handle);
205 memcpy(cp.ltk, ltk, sizeof(cp.ltk));
206 cp.ediv = ediv;
51beabdf 207 memcpy(cp.rand, rand, sizeof(cp.rand));
a7a595f6
VCG
208
209 hci_send_cmd(hdev, HCI_OP_LE_START_ENC, sizeof(cp), &cp);
210}
a7a595f6 211
e73439d8
MH
212/* Device _must_ be locked */
213void hci_sco_setup(struct hci_conn *conn, __u8 status)
214{
215 struct hci_conn *sco = conn->link;
216
e73439d8
MH
217 if (!sco)
218 return;
219
38b3fef1
AE
220 BT_DBG("hcon %p", conn);
221
e73439d8
MH
222 if (!status) {
223 if (lmp_esco_capable(conn->hdev))
224 hci_setup_sync(sco, conn->handle);
225 else
226 hci_add_sco(sco, conn->handle);
227 } else {
228 hci_proto_connect_cfm(sco, status);
229 hci_conn_del(sco);
230 }
231}
232
19c40e3b 233static void hci_conn_timeout(struct work_struct *work)
1da177e4 234{
19c40e3b 235 struct hci_conn *conn = container_of(work, struct hci_conn,
5974e4c4 236 disc_work.work);
2950f21a 237 __u8 reason;
1da177e4 238
38b3fef1 239 BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
1da177e4
LT
240
241 if (atomic_read(&conn->refcnt))
242 return;
243
6ac59344
MH
244 switch (conn->state) {
245 case BT_CONNECT:
769be974 246 case BT_CONNECT2:
fcd89c09
VT
247 if (conn->out) {
248 if (conn->type == ACL_LINK)
249 hci_acl_connect_cancel(conn);
250 else if (conn->type == LE_LINK)
251 hci_le_connect_cancel(conn);
252 }
6ac59344 253 break;
769be974 254 case BT_CONFIG:
8e87d142 255 case BT_CONNECTED:
2950f21a
MH
256 reason = hci_proto_disconn_ind(conn);
257 hci_acl_disconn(conn, reason);
6ac59344
MH
258 break;
259 default:
1da177e4 260 conn->state = BT_CLOSED;
6ac59344
MH
261 break;
262 }
1da177e4
LT
263}
264
416dc94b
GP
265/* Enter sniff mode */
266static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
267{
268 struct hci_dev *hdev = conn->hdev;
269
38b3fef1 270 BT_DBG("hcon %p mode %d", conn, conn->mode);
416dc94b
GP
271
272 if (test_bit(HCI_RAW, &hdev->flags))
273 return;
274
275 if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn))
276 return;
277
278 if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF))
279 return;
280
281 if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) {
282 struct hci_cp_sniff_subrate cp;
283 cp.handle = cpu_to_le16(conn->handle);
82781e63
AE
284 cp.max_latency = __constant_cpu_to_le16(0);
285 cp.min_remote_timeout = __constant_cpu_to_le16(0);
286 cp.min_local_timeout = __constant_cpu_to_le16(0);
416dc94b
GP
287 hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
288 }
289
51a8efd7 290 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
416dc94b
GP
291 struct hci_cp_sniff_mode cp;
292 cp.handle = cpu_to_le16(conn->handle);
293 cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
294 cp.min_interval = cpu_to_le16(hdev->sniff_min_interval);
82781e63
AE
295 cp.attempt = __constant_cpu_to_le16(4);
296 cp.timeout = __constant_cpu_to_le16(1);
416dc94b
GP
297 hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
298 }
299}
300
04837f64 301static void hci_conn_idle(unsigned long arg)
1da177e4 302{
04837f64
MH
303 struct hci_conn *conn = (void *) arg;
304
38b3fef1 305 BT_DBG("hcon %p mode %d", conn, conn->mode);
04837f64
MH
306
307 hci_conn_enter_sniff_mode(conn);
1da177e4
LT
308}
309
9f61656a
JH
310static void hci_conn_auto_accept(unsigned long arg)
311{
312 struct hci_conn *conn = (void *) arg;
313 struct hci_dev *hdev = conn->hdev;
314
9f61656a 315 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst),
5974e4c4 316 &conn->dst);
9f61656a
JH
317}
318
1da177e4
LT
319struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
320{
321 struct hci_conn *conn;
322
323 BT_DBG("%s dst %s", hdev->name, batostr(dst));
324
cb601d7e 325 conn = kzalloc(sizeof(struct hci_conn), GFP_KERNEL);
04837f64 326 if (!conn)
1da177e4 327 return NULL;
1da177e4
LT
328
329 bacpy(&conn->dst, dst);
a8746417
MH
330 conn->hdev = hdev;
331 conn->type = type;
332 conn->mode = HCI_CM_ACTIVE;
333 conn->state = BT_OPEN;
93f19c9f 334 conn->auth_type = HCI_AT_GENERAL_BONDING;
17fa4b9d 335 conn->io_capability = hdev->io_capability;
a9583556 336 conn->remote_auth = 0xff;
13d39315 337 conn->key_type = 0xff;
1da177e4 338
58a681ef 339 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
052b30b0 340 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
04837f64 341
a8746417
MH
342 switch (type) {
343 case ACL_LINK:
344 conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
345 break;
346 case SCO_LINK:
347 if (lmp_esco_capable(hdev))
efc7688b
MH
348 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
349 (hdev->esco_type & EDR_ESCO_MASK);
a8746417
MH
350 else
351 conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
352 break;
353 case ESCO_LINK:
efc7688b 354 conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
a8746417
MH
355 break;
356 }
357
1da177e4 358 skb_queue_head_init(&conn->data_q);
04837f64 359
70c1f20b 360 INIT_LIST_HEAD(&conn->chan_list);
73d80deb 361
19c40e3b 362 INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout);
b24b8a24 363 setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
9f61656a 364 setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept,
5974e4c4 365 (unsigned long) conn);
1da177e4
LT
366
367 atomic_set(&conn->refcnt, 0);
368
369 hci_dev_hold(hdev);
370
1da177e4 371 hci_conn_hash_add(hdev, conn);
3c54711c 372 if (hdev->notify)
1da177e4
LT
373 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
374
9eba32b8
MH
375 atomic_set(&conn->devref, 0);
376
a67e899c
MH
377 hci_conn_init_sysfs(conn);
378
1da177e4
LT
379 return conn;
380}
381
382int hci_conn_del(struct hci_conn *conn)
383{
384 struct hci_dev *hdev = conn->hdev;
385
38b3fef1 386 BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle);
1da177e4 387
04837f64
MH
388 del_timer(&conn->idle_timer);
389
19c40e3b 390 cancel_delayed_work_sync(&conn->disc_work);
1da177e4 391
9f61656a
JH
392 del_timer(&conn->auto_accept_timer);
393
5b7f9909 394 if (conn->type == ACL_LINK) {
1da177e4
LT
395 struct hci_conn *sco = conn->link;
396 if (sco)
397 sco->link = NULL;
398
399 /* Unacked frames */
400 hdev->acl_cnt += conn->sent;
6ed58ec5
VT
401 } else if (conn->type == LE_LINK) {
402 if (hdev->le_pkts)
403 hdev->le_cnt += conn->sent;
404 else
405 hdev->acl_cnt += conn->sent;
5b7f9909
MH
406 } else {
407 struct hci_conn *acl = conn->link;
408 if (acl) {
409 acl->link = NULL;
410 hci_conn_put(acl);
411 }
1da177e4
LT
412 }
413
2c33c06a 414 hci_chan_list_flush(conn);
73d80deb 415
9740e49d
AE
416 if (conn->amp_mgr)
417 amp_mgr_put(conn->amp_mgr);
418
1da177e4 419 hci_conn_hash_del(hdev, conn);
3c54711c 420 if (hdev->notify)
1da177e4 421 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
7d0db0a3 422
1da177e4 423 skb_queue_purge(&conn->data_q);
1da177e4 424
9eba32b8 425 hci_conn_put_device(conn);
2ae9a6be 426
384943ec
MH
427 hci_dev_put(hdev);
428
163f4dab
TT
429 if (conn->handle == 0)
430 kfree(conn);
431
1da177e4
LT
432 return 0;
433}
434
435struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
436{
437 int use_src = bacmp(src, BDADDR_ANY);
8035ded4 438 struct hci_dev *hdev = NULL, *d;
1da177e4
LT
439
440 BT_DBG("%s -> %s", batostr(src), batostr(dst));
441
f20d09d5 442 read_lock(&hci_dev_list_lock);
1da177e4 443
8035ded4 444 list_for_each_entry(d, &hci_dev_list, list) {
8fc9ced3 445 if (!test_bit(HCI_UP, &d->flags) ||
d300fa9b
AE
446 test_bit(HCI_RAW, &d->flags) ||
447 d->dev_type != HCI_BREDR)
1da177e4
LT
448 continue;
449
8e87d142 450 /* Simple routing:
1da177e4
LT
451 * No source address - find interface with bdaddr != dst
452 * Source address - find interface with bdaddr == src
453 */
454
455 if (use_src) {
456 if (!bacmp(&d->bdaddr, src)) {
457 hdev = d; break;
458 }
459 } else {
460 if (bacmp(&d->bdaddr, dst)) {
461 hdev = d; break;
462 }
463 }
464 }
465
466 if (hdev)
467 hdev = hci_dev_hold(hdev);
468
f20d09d5 469 read_unlock(&hci_dev_list_lock);
1da177e4
LT
470 return hdev;
471}
472EXPORT_SYMBOL(hci_get_route);
473
fcd89c09 474/* Create SCO, ACL or LE connection.
1da177e4 475 * Device _must_ be locked */
b12f62cf
AG
476struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
477 __u8 dst_type, __u8 sec_level, __u8 auth_type)
1da177e4
LT
478{
479 struct hci_conn *acl;
5b7f9909 480 struct hci_conn *sco;
fcd89c09 481 struct hci_conn *le;
1da177e4
LT
482
483 BT_DBG("%s dst %s", hdev->name, batostr(dst));
484
fcd89c09
VT
485 if (type == LE_LINK) {
486 le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
9f0caeb1 487 if (!le) {
dfc94dbd
AK
488 le = hci_conn_hash_lookup_state(hdev, LE_LINK,
489 BT_CONNECT);
490 if (le)
491 return ERR_PTR(-EBUSY);
492
9f0caeb1
VCG
493 le = hci_conn_add(hdev, LE_LINK, dst);
494 if (!le)
495 return ERR_PTR(-ENOMEM);
496
b12f62cf 497 le->dst_type = bdaddr_to_le(dst_type);
9f0caeb1
VCG
498 hci_le_connect(le);
499 }
eda42b50 500
9f0caeb1
VCG
501 le->pending_sec_level = sec_level;
502 le->auth_type = auth_type;
fcd89c09
VT
503
504 hci_conn_hold(le);
505
506 return le;
507 }
508
70f23020
AE
509 acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
510 if (!acl) {
511 acl = hci_conn_add(hdev, ACL_LINK, dst);
512 if (!acl)
48c7aba9 513 return ERR_PTR(-ENOMEM);
1da177e4
LT
514 }
515
516 hci_conn_hold(acl);
517
09ab6f4c 518 if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
765c2a96
JH
519 acl->sec_level = BT_SECURITY_LOW;
520 acl->pending_sec_level = sec_level;
09ab6f4c 521 acl->auth_type = auth_type;
1da177e4 522 hci_acl_connect(acl);
09ab6f4c 523 }
1da177e4 524
5b7f9909
MH
525 if (type == ACL_LINK)
526 return acl;
1da177e4 527
70f23020
AE
528 sco = hci_conn_hash_lookup_ba(hdev, type, dst);
529 if (!sco) {
530 sco = hci_conn_add(hdev, type, dst);
531 if (!sco) {
5b7f9909 532 hci_conn_put(acl);
48c7aba9 533 return ERR_PTR(-ENOMEM);
1da177e4 534 }
5b7f9909 535 }
1da177e4 536
5b7f9909
MH
537 acl->link = sco;
538 sco->link = acl;
1da177e4 539
5b7f9909 540 hci_conn_hold(sco);
1da177e4 541
5b7f9909 542 if (acl->state == BT_CONNECTED &&
5974e4c4 543 (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
58a681ef 544 set_bit(HCI_CONN_POWER_SAVE, &acl->flags);
14b12d0b 545 hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON);
c390216b 546
51a8efd7 547 if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) {
e73439d8 548 /* defer SCO setup until mode change completed */
51a8efd7 549 set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags);
e73439d8
MH
550 return sco;
551 }
552
553 hci_sco_setup(acl, 0x00);
b6a0dc82 554 }
5b7f9909
MH
555
556 return sco;
1da177e4 557}
1da177e4 558
e7c29cb1
MH
559/* Check link security requirement */
560int hci_conn_check_link_mode(struct hci_conn *conn)
561{
38b3fef1 562 BT_DBG("hcon %p", conn);
e7c29cb1 563
aa64a8b5 564 if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
e7c29cb1
MH
565 return 0;
566
567 return 1;
568}
e7c29cb1 569
1da177e4 570/* Authenticate remote device */
0684e5f9 571static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
1da177e4 572{
38b3fef1 573 BT_DBG("hcon %p", conn);
1da177e4 574
765c2a96
JH
575 if (conn->pending_sec_level > sec_level)
576 sec_level = conn->pending_sec_level;
577
96a31833 578 if (sec_level > conn->sec_level)
765c2a96 579 conn->pending_sec_level = sec_level;
96a31833 580 else if (conn->link_mode & HCI_LM_AUTH)
1da177e4
LT
581 return 1;
582
65cf686e
JH
583 /* Make sure we preserve an existing MITM requirement*/
584 auth_type |= (conn->auth_type & 0x01);
585
96a31833
MH
586 conn->auth_type = auth_type;
587
51a8efd7 588 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
1da177e4 589 struct hci_cp_auth_requested cp;
b7d05bad
PH
590
591 /* encrypt must be pending if auth is also pending */
592 set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
593
aca3192c 594 cp.handle = cpu_to_le16(conn->handle);
40be492f 595 hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
5974e4c4 596 sizeof(cp), &cp);
19f8def0 597 if (conn->key_type != 0xff)
51a8efd7 598 set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
1da177e4 599 }
8c1b2355 600
1da177e4
LT
601 return 0;
602}
1da177e4 603
13d39315
WR
604/* Encrypt the the link */
605static void hci_conn_encrypt(struct hci_conn *conn)
606{
38b3fef1 607 BT_DBG("hcon %p", conn);
13d39315 608
51a8efd7 609 if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
13d39315
WR
610 struct hci_cp_set_conn_encrypt cp;
611 cp.handle = cpu_to_le16(conn->handle);
612 cp.encrypt = 0x01;
613 hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
5974e4c4 614 &cp);
13d39315
WR
615 }
616}
617
8c1b2355 618/* Enable security */
0684e5f9 619int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
1da177e4 620{
38b3fef1 621 BT_DBG("hcon %p", conn);
1da177e4 622
d8343f12
VCG
623 if (conn->type == LE_LINK)
624 return smp_conn_security(conn, sec_level);
625
13d39315 626 /* For sdp we don't need the link key. */
8c1b2355
MH
627 if (sec_level == BT_SECURITY_SDP)
628 return 1;
629
13d39315
WR
630 /* For non 2.1 devices and low security level we don't need the link
631 key. */
aa64a8b5 632 if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
3fdca1e1 633 return 1;
8c1b2355 634
13d39315
WR
635 /* For other security levels we need the link key. */
636 if (!(conn->link_mode & HCI_LM_AUTH))
637 goto auth;
638
639 /* An authenticated combination key has sufficient security for any
640 security level. */
641 if (conn->key_type == HCI_LK_AUTH_COMBINATION)
642 goto encrypt;
643
644 /* An unauthenticated combination key has sufficient security for
645 security level 1 and 2. */
646 if (conn->key_type == HCI_LK_UNAUTH_COMBINATION &&
5974e4c4 647 (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW))
13d39315
WR
648 goto encrypt;
649
650 /* A combination key has always sufficient security for the security
651 levels 1 or 2. High security level requires the combination key
652 is generated using maximum PIN code length (16).
653 For pre 2.1 units. */
654 if (conn->key_type == HCI_LK_COMBINATION &&
5974e4c4 655 (sec_level != BT_SECURITY_HIGH || conn->pin_length == 16))
13d39315
WR
656 goto encrypt;
657
658auth:
51a8efd7 659 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
1da177e4
LT
660 return 0;
661
6fdf658c
LAD
662 if (!hci_conn_auth(conn, sec_level, auth_type))
663 return 0;
13d39315
WR
664
665encrypt:
666 if (conn->link_mode & HCI_LM_ENCRYPT)
667 return 1;
8c1b2355 668
13d39315 669 hci_conn_encrypt(conn);
1da177e4
LT
670 return 0;
671}
8c1b2355 672EXPORT_SYMBOL(hci_conn_security);
1da177e4 673
b3b1b061
WR
674/* Check secure link requirement */
675int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level)
676{
38b3fef1 677 BT_DBG("hcon %p", conn);
b3b1b061
WR
678
679 if (sec_level != BT_SECURITY_HIGH)
680 return 1; /* Accept if non-secure is required */
681
ef4177e2 682 if (conn->sec_level == BT_SECURITY_HIGH)
b3b1b061
WR
683 return 1;
684
685 return 0; /* Reject not secure link */
686}
687EXPORT_SYMBOL(hci_conn_check_secure);
688
1da177e4
LT
689/* Change link key */
690int hci_conn_change_link_key(struct hci_conn *conn)
691{
38b3fef1 692 BT_DBG("hcon %p", conn);
1da177e4 693
51a8efd7 694 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
1da177e4 695 struct hci_cp_change_conn_link_key cp;
aca3192c 696 cp.handle = cpu_to_le16(conn->handle);
40be492f 697 hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
5974e4c4 698 sizeof(cp), &cp);
1da177e4 699 }
8c1b2355 700
1da177e4
LT
701 return 0;
702}
1da177e4
LT
703
704/* Switch role */
8c1b2355 705int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
1da177e4 706{
38b3fef1 707 BT_DBG("hcon %p", conn);
1da177e4
LT
708
709 if (!role && conn->link_mode & HCI_LM_MASTER)
710 return 1;
711
51a8efd7 712 if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
1da177e4
LT
713 struct hci_cp_switch_role cp;
714 bacpy(&cp.bdaddr, &conn->dst);
715 cp.role = role;
a9de9248 716 hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
1da177e4 717 }
8c1b2355 718
1da177e4
LT
719 return 0;
720}
721EXPORT_SYMBOL(hci_conn_switch_role);
722
04837f64 723/* Enter active mode */
14b12d0b 724void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
04837f64
MH
725{
726 struct hci_dev *hdev = conn->hdev;
727
38b3fef1 728 BT_DBG("hcon %p mode %d", conn, conn->mode);
04837f64
MH
729
730 if (test_bit(HCI_RAW, &hdev->flags))
731 return;
732
14b12d0b
JG
733 if (conn->mode != HCI_CM_SNIFF)
734 goto timer;
735
58a681ef 736 if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active)
04837f64
MH
737 goto timer;
738
51a8efd7 739 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
04837f64 740 struct hci_cp_exit_sniff_mode cp;
aca3192c 741 cp.handle = cpu_to_le16(conn->handle);
a9de9248 742 hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
04837f64
MH
743 }
744
745timer:
746 if (hdev->idle_timeout > 0)
747 mod_timer(&conn->idle_timer,
5974e4c4 748 jiffies + msecs_to_jiffies(hdev->idle_timeout));
04837f64
MH
749}
750
1da177e4
LT
751/* Drop all connection on the device */
752void hci_conn_hash_flush(struct hci_dev *hdev)
753{
754 struct hci_conn_hash *h = &hdev->conn_hash;
3c4e0df0 755 struct hci_conn *c, *n;
1da177e4
LT
756
757 BT_DBG("hdev %s", hdev->name);
758
3c4e0df0 759 list_for_each_entry_safe(c, n, &h->list, list) {
1da177e4
LT
760 c->state = BT_CLOSED;
761
9f5a0d7b 762 hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
1da177e4
LT
763 hci_conn_del(c);
764 }
765}
766
a9de9248
MH
767/* Check pending connect attempts */
768void hci_conn_check_pending(struct hci_dev *hdev)
769{
770 struct hci_conn *conn;
771
772 BT_DBG("hdev %s", hdev->name);
773
774 hci_dev_lock(hdev);
775
776 conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
777 if (conn)
778 hci_acl_connect(conn);
779
780 hci_dev_unlock(hdev);
781}
782
9eba32b8
MH
783void hci_conn_hold_device(struct hci_conn *conn)
784{
785 atomic_inc(&conn->devref);
786}
787EXPORT_SYMBOL(hci_conn_hold_device);
788
789void hci_conn_put_device(struct hci_conn *conn)
790{
791 if (atomic_dec_and_test(&conn->devref))
792 hci_conn_del_sysfs(conn);
793}
794EXPORT_SYMBOL(hci_conn_put_device);
795
1da177e4
LT
796int hci_get_conn_list(void __user *arg)
797{
fc5fef61 798 struct hci_conn *c;
1da177e4
LT
799 struct hci_conn_list_req req, *cl;
800 struct hci_conn_info *ci;
801 struct hci_dev *hdev;
1da177e4
LT
802 int n = 0, size, err;
803
804 if (copy_from_user(&req, arg, sizeof(req)))
805 return -EFAULT;
806
807 if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
808 return -EINVAL;
809
810 size = sizeof(req) + req.conn_num * sizeof(*ci);
811
70f23020
AE
812 cl = kmalloc(size, GFP_KERNEL);
813 if (!cl)
1da177e4
LT
814 return -ENOMEM;
815
70f23020
AE
816 hdev = hci_dev_get(req.dev_id);
817 if (!hdev) {
1da177e4
LT
818 kfree(cl);
819 return -ENODEV;
820 }
821
822 ci = cl->conn_info;
823
09fd0de5 824 hci_dev_lock(hdev);
8035ded4 825 list_for_each_entry(c, &hdev->conn_hash.list, list) {
1da177e4
LT
826 bacpy(&(ci + n)->bdaddr, &c->dst);
827 (ci + n)->handle = c->handle;
828 (ci + n)->type = c->type;
829 (ci + n)->out = c->out;
830 (ci + n)->state = c->state;
831 (ci + n)->link_mode = c->link_mode;
832 if (++n >= req.conn_num)
833 break;
834 }
09fd0de5 835 hci_dev_unlock(hdev);
1da177e4
LT
836
837 cl->dev_id = hdev->id;
838 cl->conn_num = n;
839 size = sizeof(req) + n * sizeof(*ci);
840
841 hci_dev_put(hdev);
842
843 err = copy_to_user(arg, cl, size);
844 kfree(cl);
845
846 return err ? -EFAULT : 0;
847}
848
849int hci_get_conn_info(struct hci_dev *hdev, void __user *arg)
850{
851 struct hci_conn_info_req req;
852 struct hci_conn_info ci;
853 struct hci_conn *conn;
854 char __user *ptr = arg + sizeof(req);
855
856 if (copy_from_user(&req, arg, sizeof(req)))
857 return -EFAULT;
858
09fd0de5 859 hci_dev_lock(hdev);
1da177e4
LT
860 conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
861 if (conn) {
862 bacpy(&ci.bdaddr, &conn->dst);
863 ci.handle = conn->handle;
864 ci.type = conn->type;
865 ci.out = conn->out;
866 ci.state = conn->state;
867 ci.link_mode = conn->link_mode;
868 }
09fd0de5 869 hci_dev_unlock(hdev);
1da177e4
LT
870
871 if (!conn)
872 return -ENOENT;
873
874 return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
875}
40be492f
MH
876
877int hci_get_auth_info(struct hci_dev *hdev, void __user *arg)
878{
879 struct hci_auth_info_req req;
880 struct hci_conn *conn;
881
882 if (copy_from_user(&req, arg, sizeof(req)))
883 return -EFAULT;
884
09fd0de5 885 hci_dev_lock(hdev);
40be492f
MH
886 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
887 if (conn)
888 req.type = conn->auth_type;
09fd0de5 889 hci_dev_unlock(hdev);
40be492f
MH
890
891 if (!conn)
892 return -ENOENT;
893
894 return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
895}
73d80deb
LAD
896
897struct hci_chan *hci_chan_create(struct hci_conn *conn)
898{
899 struct hci_dev *hdev = conn->hdev;
900 struct hci_chan *chan;
901
38b3fef1 902 BT_DBG("%s hcon %p", hdev->name, conn);
73d80deb 903
75d7735c 904 chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
73d80deb
LAD
905 if (!chan)
906 return NULL;
907
908 chan->conn = conn;
909 skb_queue_head_init(&chan->data_q);
910
8192edef 911 list_add_rcu(&chan->list, &conn->chan_list);
73d80deb
LAD
912
913 return chan;
914}
915
916int hci_chan_del(struct hci_chan *chan)
917{
918 struct hci_conn *conn = chan->conn;
919 struct hci_dev *hdev = conn->hdev;
920
38b3fef1 921 BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan);
73d80deb 922
8192edef
GP
923 list_del_rcu(&chan->list);
924
925 synchronize_rcu();
73d80deb
LAD
926
927 skb_queue_purge(&chan->data_q);
928 kfree(chan);
929
930 return 0;
931}
932
2c33c06a 933void hci_chan_list_flush(struct hci_conn *conn)
73d80deb 934{
2a5a5ec6 935 struct hci_chan *chan, *n;
73d80deb 936
38b3fef1 937 BT_DBG("hcon %p", conn);
73d80deb 938
2a5a5ec6 939 list_for_each_entry_safe(chan, n, &conn->chan_list, list)
73d80deb
LAD
940 hci_chan_del(chan);
941}
This page took 0.646737 seconds and 5 git commands to generate.