Bluetooth: Move a2mp.h header file into net/bluetooth/
[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>
d8343f12 31#include <net/bluetooth/smp.h>
1da177e4 32
7024728e
MH
33#include "a2mp.h"
34
2dea632f
FD
35struct sco_param {
36 u16 pkt_type;
37 u16 max_latency;
38};
39
40static const struct sco_param sco_param_cvsd[] = {
41 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000a }, /* S3 */
42 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x0007 }, /* S2 */
43 { EDR_ESCO_MASK | ESCO_EV3, 0x0007 }, /* S1 */
44 { EDR_ESCO_MASK | ESCO_HV3, 0xffff }, /* D1 */
45 { EDR_ESCO_MASK | ESCO_HV1, 0xffff }, /* D0 */
46};
47
48static const struct sco_param sco_param_wideband[] = {
49 { EDR_ESCO_MASK & ~ESCO_2EV3, 0x000d }, /* T2 */
50 { EDR_ESCO_MASK | ESCO_EV3, 0x0008 }, /* T1 */
51};
52
1aef8669 53static void hci_le_create_connection_cancel(struct hci_conn *conn)
fcd89c09
VT
54{
55 hci_send_cmd(conn->hdev, HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
56}
57
1aef8669 58static void hci_acl_create_connection(struct hci_conn *conn)
1da177e4
LT
59{
60 struct hci_dev *hdev = conn->hdev;
61 struct inquiry_entry *ie;
62 struct hci_cp_create_conn cp;
63
42d2d87c 64 BT_DBG("hcon %p", conn);
1da177e4
LT
65
66 conn->state = BT_CONNECT;
a0c808b3 67 conn->out = true;
a8746417 68
1da177e4
LT
69 conn->link_mode = HCI_LM_MASTER;
70
4c67bc74
MH
71 conn->attempt++;
72
e4e8e37c
MH
73 conn->link_policy = hdev->link_policy;
74
1da177e4
LT
75 memset(&cp, 0, sizeof(cp));
76 bacpy(&cp.bdaddr, &conn->dst);
77 cp.pscan_rep_mode = 0x02;
78
70f23020
AE
79 ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
80 if (ie) {
41a96212
MH
81 if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
82 cp.pscan_rep_mode = ie->data.pscan_rep_mode;
83 cp.pscan_mode = ie->data.pscan_mode;
84 cp.clock_offset = ie->data.clock_offset |
82781e63 85 __constant_cpu_to_le16(0x8000);
41a96212
MH
86 }
87
1da177e4 88 memcpy(conn->dev_class, ie->data.dev_class, 3);
58a681ef
JH
89 if (ie->data.ssp_mode > 0)
90 set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
1da177e4
LT
91 }
92
a8746417 93 cp.pkt_type = cpu_to_le16(conn->pkt_type);
1da177e4 94 if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
b6a0dc82 95 cp.role_switch = 0x01;
1da177e4 96 else
b6a0dc82 97 cp.role_switch = 0x00;
4c67bc74 98
a9de9248 99 hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
1da177e4
LT
100}
101
1aef8669 102static void hci_acl_create_connection_cancel(struct hci_conn *conn)
6ac59344
MH
103{
104 struct hci_cp_create_conn_cancel cp;
105
38b3fef1 106 BT_DBG("hcon %p", conn);
6ac59344 107
d095c1eb 108 if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2)
6ac59344
MH
109 return;
110
111 bacpy(&cp.bdaddr, &conn->dst);
a9de9248 112 hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp);
6ac59344
MH
113}
114
93796fa6
CT
115static void hci_reject_sco(struct hci_conn *conn)
116{
117 struct hci_cp_reject_sync_conn_req cp;
118
119 cp.reason = HCI_ERROR_REMOTE_USER_TERM;
120 bacpy(&cp.bdaddr, &conn->dst);
121
122 hci_send_cmd(conn->hdev, HCI_OP_REJECT_SYNC_CONN_REQ, sizeof(cp), &cp);
123}
124
bed71748 125void hci_disconnect(struct hci_conn *conn, __u8 reason)
1da177e4
LT
126{
127 struct hci_cp_disconnect cp;
128
38b3fef1 129 BT_DBG("hcon %p", conn);
1da177e4
LT
130
131 conn->state = BT_DISCONN;
132
aca3192c 133 cp.handle = cpu_to_le16(conn->handle);
1da177e4 134 cp.reason = reason;
a9de9248 135 hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
1da177e4
LT
136}
137
53502d69
AE
138static void hci_amp_disconn(struct hci_conn *conn, __u8 reason)
139{
140 struct hci_cp_disconn_phy_link cp;
141
142 BT_DBG("hcon %p", conn);
143
144 conn->state = BT_DISCONN;
145
146 cp.phy_handle = HCI_PHY_HANDLE(conn->handle);
147 cp.reason = reason;
148 hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
149 sizeof(cp), &cp);
150}
151
57f5d0d1 152static void hci_add_sco(struct hci_conn *conn, __u16 handle)
1da177e4
LT
153{
154 struct hci_dev *hdev = conn->hdev;
155 struct hci_cp_add_sco cp;
156
38b3fef1 157 BT_DBG("hcon %p", conn);
1da177e4
LT
158
159 conn->state = BT_CONNECT;
a0c808b3 160 conn->out = true;
1da177e4 161
efc7688b
MH
162 conn->attempt++;
163
aca3192c 164 cp.handle = cpu_to_le16(handle);
a8746417 165 cp.pkt_type = cpu_to_le16(conn->pkt_type);
1da177e4 166
a9de9248 167 hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
1da177e4
LT
168}
169
2dea632f 170bool hci_setup_sync(struct hci_conn *conn, __u16 handle)
b6a0dc82
MH
171{
172 struct hci_dev *hdev = conn->hdev;
173 struct hci_cp_setup_sync_conn cp;
2dea632f 174 const struct sco_param *param;
b6a0dc82 175
38b3fef1 176 BT_DBG("hcon %p", conn);
b6a0dc82
MH
177
178 conn->state = BT_CONNECT;
a0c808b3 179 conn->out = true;
b6a0dc82 180
efc7688b
MH
181 conn->attempt++;
182
b6a0dc82 183 cp.handle = cpu_to_le16(handle);
b6a0dc82 184
82781e63
AE
185 cp.tx_bandwidth = __constant_cpu_to_le32(0x00001f40);
186 cp.rx_bandwidth = __constant_cpu_to_le32(0x00001f40);
10c62ddc
FD
187 cp.voice_setting = cpu_to_le16(conn->setting);
188
189 switch (conn->setting & SCO_AIRMODE_MASK) {
190 case SCO_AIRMODE_TRANSP:
2dea632f
FD
191 if (conn->attempt > ARRAY_SIZE(sco_param_wideband))
192 return false;
10c62ddc 193 cp.retrans_effort = 0x02;
2dea632f 194 param = &sco_param_wideband[conn->attempt - 1];
10c62ddc
FD
195 break;
196 case SCO_AIRMODE_CVSD:
2dea632f
FD
197 if (conn->attempt > ARRAY_SIZE(sco_param_cvsd))
198 return false;
199 cp.retrans_effort = 0x01;
200 param = &sco_param_cvsd[conn->attempt - 1];
10c62ddc 201 break;
2dea632f
FD
202 default:
203 return false;
10c62ddc 204 }
b6a0dc82 205
2dea632f
FD
206 cp.pkt_type = __cpu_to_le16(param->pkt_type);
207 cp.max_latency = __cpu_to_le16(param->max_latency);
208
209 if (hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp) < 0)
210 return false;
211
212 return true;
b6a0dc82
MH
213}
214
2ce603eb 215void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
5974e4c4 216 u16 latency, u16 to_multiplier)
2ce603eb
CT
217{
218 struct hci_cp_le_conn_update cp;
219 struct hci_dev *hdev = conn->hdev;
220
221 memset(&cp, 0, sizeof(cp));
222
223 cp.handle = cpu_to_le16(conn->handle);
224 cp.conn_interval_min = cpu_to_le16(min);
225 cp.conn_interval_max = cpu_to_le16(max);
226 cp.conn_latency = cpu_to_le16(latency);
227 cp.supervision_timeout = cpu_to_le16(to_multiplier);
82781e63
AE
228 cp.min_ce_len = __constant_cpu_to_le16(0x0001);
229 cp.max_ce_len = __constant_cpu_to_le16(0x0001);
2ce603eb
CT
230
231 hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp);
232}
2ce603eb 233
a7a595f6 234void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
5974e4c4 235 __u8 ltk[16])
a7a595f6
VCG
236{
237 struct hci_dev *hdev = conn->hdev;
238 struct hci_cp_le_start_enc cp;
239
38b3fef1 240 BT_DBG("hcon %p", conn);
a7a595f6
VCG
241
242 memset(&cp, 0, sizeof(cp));
243
244 cp.handle = cpu_to_le16(conn->handle);
245 memcpy(cp.ltk, ltk, sizeof(cp.ltk));
246 cp.ediv = ediv;
51beabdf 247 memcpy(cp.rand, rand, sizeof(cp.rand));
a7a595f6
VCG
248
249 hci_send_cmd(hdev, HCI_OP_LE_START_ENC, sizeof(cp), &cp);
250}
a7a595f6 251
e73439d8
MH
252/* Device _must_ be locked */
253void hci_sco_setup(struct hci_conn *conn, __u8 status)
254{
255 struct hci_conn *sco = conn->link;
256
e73439d8
MH
257 if (!sco)
258 return;
259
38b3fef1
AE
260 BT_DBG("hcon %p", conn);
261
e73439d8
MH
262 if (!status) {
263 if (lmp_esco_capable(conn->hdev))
264 hci_setup_sync(sco, conn->handle);
265 else
266 hci_add_sco(sco, conn->handle);
267 } else {
268 hci_proto_connect_cfm(sco, status);
269 hci_conn_del(sco);
270 }
271}
272
53502d69
AE
273static void hci_conn_disconnect(struct hci_conn *conn)
274{
275 __u8 reason = hci_proto_disconn_ind(conn);
276
277 switch (conn->type) {
53502d69
AE
278 case AMP_LINK:
279 hci_amp_disconn(conn, reason);
280 break;
4c02e2d4 281 default:
bed71748 282 hci_disconnect(conn, reason);
4c02e2d4 283 break;
53502d69
AE
284 }
285}
286
19c40e3b 287static void hci_conn_timeout(struct work_struct *work)
1da177e4 288{
19c40e3b 289 struct hci_conn *conn = container_of(work, struct hci_conn,
5974e4c4 290 disc_work.work);
1da177e4 291
38b3fef1 292 BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
1da177e4
LT
293
294 if (atomic_read(&conn->refcnt))
295 return;
296
6ac59344
MH
297 switch (conn->state) {
298 case BT_CONNECT:
769be974 299 case BT_CONNECT2:
fcd89c09
VT
300 if (conn->out) {
301 if (conn->type == ACL_LINK)
1aef8669 302 hci_acl_create_connection_cancel(conn);
fcd89c09 303 else if (conn->type == LE_LINK)
1aef8669 304 hci_le_create_connection_cancel(conn);
93796fa6
CT
305 } else if (conn->type == SCO_LINK || conn->type == ESCO_LINK) {
306 hci_reject_sco(conn);
fcd89c09 307 }
6ac59344 308 break;
769be974 309 case BT_CONFIG:
8e87d142 310 case BT_CONNECTED:
53502d69 311 hci_conn_disconnect(conn);
6ac59344
MH
312 break;
313 default:
1da177e4 314 conn->state = BT_CLOSED;
6ac59344
MH
315 break;
316 }
1da177e4
LT
317}
318
416dc94b
GP
319/* Enter sniff mode */
320static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
321{
322 struct hci_dev *hdev = conn->hdev;
323
38b3fef1 324 BT_DBG("hcon %p mode %d", conn, conn->mode);
416dc94b
GP
325
326 if (test_bit(HCI_RAW, &hdev->flags))
327 return;
328
329 if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn))
330 return;
331
332 if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF))
333 return;
334
335 if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) {
336 struct hci_cp_sniff_subrate cp;
337 cp.handle = cpu_to_le16(conn->handle);
82781e63
AE
338 cp.max_latency = __constant_cpu_to_le16(0);
339 cp.min_remote_timeout = __constant_cpu_to_le16(0);
340 cp.min_local_timeout = __constant_cpu_to_le16(0);
416dc94b
GP
341 hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
342 }
343
51a8efd7 344 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
416dc94b
GP
345 struct hci_cp_sniff_mode cp;
346 cp.handle = cpu_to_le16(conn->handle);
347 cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
348 cp.min_interval = cpu_to_le16(hdev->sniff_min_interval);
82781e63
AE
349 cp.attempt = __constant_cpu_to_le16(4);
350 cp.timeout = __constant_cpu_to_le16(1);
416dc94b
GP
351 hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
352 }
353}
354
04837f64 355static void hci_conn_idle(unsigned long arg)
1da177e4 356{
04837f64
MH
357 struct hci_conn *conn = (void *) arg;
358
38b3fef1 359 BT_DBG("hcon %p mode %d", conn, conn->mode);
04837f64
MH
360
361 hci_conn_enter_sniff_mode(conn);
1da177e4
LT
362}
363
9f61656a
JH
364static void hci_conn_auto_accept(unsigned long arg)
365{
366 struct hci_conn *conn = (void *) arg;
367 struct hci_dev *hdev = conn->hdev;
368
9f61656a 369 hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst),
5974e4c4 370 &conn->dst);
9f61656a
JH
371}
372
1da177e4
LT
373struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
374{
375 struct hci_conn *conn;
376
6ed93dc6 377 BT_DBG("%s dst %pMR", hdev->name, dst);
1da177e4 378
cb601d7e 379 conn = kzalloc(sizeof(struct hci_conn), GFP_KERNEL);
04837f64 380 if (!conn)
1da177e4 381 return NULL;
1da177e4
LT
382
383 bacpy(&conn->dst, dst);
a8746417
MH
384 conn->hdev = hdev;
385 conn->type = type;
386 conn->mode = HCI_CM_ACTIVE;
387 conn->state = BT_OPEN;
93f19c9f 388 conn->auth_type = HCI_AT_GENERAL_BONDING;
17fa4b9d 389 conn->io_capability = hdev->io_capability;
a9583556 390 conn->remote_auth = 0xff;
13d39315 391 conn->key_type = 0xff;
1da177e4 392
58a681ef 393 set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
052b30b0 394 conn->disc_timeout = HCI_DISCONN_TIMEOUT;
04837f64 395
a8746417
MH
396 switch (type) {
397 case ACL_LINK:
398 conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
399 break;
400 case SCO_LINK:
401 if (lmp_esco_capable(hdev))
efc7688b
MH
402 conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
403 (hdev->esco_type & EDR_ESCO_MASK);
a8746417
MH
404 else
405 conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
406 break;
407 case ESCO_LINK:
efc7688b 408 conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
a8746417
MH
409 break;
410 }
411
1da177e4 412 skb_queue_head_init(&conn->data_q);
04837f64 413
70c1f20b 414 INIT_LIST_HEAD(&conn->chan_list);
73d80deb 415
19c40e3b 416 INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout);
b24b8a24 417 setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
9f61656a 418 setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept,
5974e4c4 419 (unsigned long) conn);
1da177e4
LT
420
421 atomic_set(&conn->refcnt, 0);
422
423 hci_dev_hold(hdev);
424
1da177e4 425 hci_conn_hash_add(hdev, conn);
3c54711c 426 if (hdev->notify)
1da177e4
LT
427 hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
428
a67e899c
MH
429 hci_conn_init_sysfs(conn);
430
1da177e4
LT
431 return conn;
432}
433
434int hci_conn_del(struct hci_conn *conn)
435{
436 struct hci_dev *hdev = conn->hdev;
437
38b3fef1 438 BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle);
1da177e4 439
04837f64
MH
440 del_timer(&conn->idle_timer);
441
19c40e3b 442 cancel_delayed_work_sync(&conn->disc_work);
1da177e4 443
9f61656a
JH
444 del_timer(&conn->auto_accept_timer);
445
5b7f9909 446 if (conn->type == ACL_LINK) {
1da177e4
LT
447 struct hci_conn *sco = conn->link;
448 if (sco)
449 sco->link = NULL;
450
451 /* Unacked frames */
452 hdev->acl_cnt += conn->sent;
6ed58ec5
VT
453 } else if (conn->type == LE_LINK) {
454 if (hdev->le_pkts)
455 hdev->le_cnt += conn->sent;
456 else
457 hdev->acl_cnt += conn->sent;
5b7f9909
MH
458 } else {
459 struct hci_conn *acl = conn->link;
460 if (acl) {
461 acl->link = NULL;
76a68ba0 462 hci_conn_drop(acl);
5b7f9909 463 }
1da177e4
LT
464 }
465
2c33c06a 466 hci_chan_list_flush(conn);
73d80deb 467
9740e49d
AE
468 if (conn->amp_mgr)
469 amp_mgr_put(conn->amp_mgr);
470
1da177e4 471 hci_conn_hash_del(hdev, conn);
3c54711c 472 if (hdev->notify)
1da177e4 473 hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
7d0db0a3 474
1da177e4 475 skb_queue_purge(&conn->data_q);
1da177e4 476
fc225c3f 477 hci_conn_del_sysfs(conn);
2ae9a6be 478
384943ec
MH
479 hci_dev_put(hdev);
480
8d12356f 481 hci_conn_put(conn);
163f4dab 482
1da177e4
LT
483 return 0;
484}
485
486struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
487{
488 int use_src = bacmp(src, BDADDR_ANY);
8035ded4 489 struct hci_dev *hdev = NULL, *d;
1da177e4 490
6ed93dc6 491 BT_DBG("%pMR -> %pMR", src, dst);
1da177e4 492
f20d09d5 493 read_lock(&hci_dev_list_lock);
1da177e4 494
8035ded4 495 list_for_each_entry(d, &hci_dev_list, list) {
8fc9ced3 496 if (!test_bit(HCI_UP, &d->flags) ||
d300fa9b 497 test_bit(HCI_RAW, &d->flags) ||
af750e94 498 test_bit(HCI_USER_CHANNEL, &d->dev_flags) ||
d300fa9b 499 d->dev_type != HCI_BREDR)
1da177e4
LT
500 continue;
501
8e87d142 502 /* Simple routing:
1da177e4
LT
503 * No source address - find interface with bdaddr != dst
504 * Source address - find interface with bdaddr == src
505 */
506
507 if (use_src) {
508 if (!bacmp(&d->bdaddr, src)) {
509 hdev = d; break;
510 }
511 } else {
512 if (bacmp(&d->bdaddr, dst)) {
513 hdev = d; break;
514 }
515 }
516 }
517
518 if (hdev)
519 hdev = hci_dev_hold(hdev);
520
f20d09d5 521 read_unlock(&hci_dev_list_lock);
1da177e4
LT
522 return hdev;
523}
524EXPORT_SYMBOL(hci_get_route);
525
1d399ae5
AG
526static void create_le_conn_complete(struct hci_dev *hdev, u8 status)
527{
528 struct hci_conn *conn;
529
530 if (status == 0)
531 return;
532
533 BT_ERR("HCI request failed to create LE connection: status 0x%2.2x",
534 status);
535
536 hci_dev_lock(hdev);
537
538 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
539 if (!conn)
540 goto done;
541
542 conn->state = BT_CLOSED;
543
544 mgmt_connect_failed(hdev, &conn->dst, conn->type, conn->dst_type,
545 status);
546
547 hci_proto_connect_cfm(conn, status);
548
549 hci_conn_del(conn);
550
551done:
552 hci_dev_unlock(hdev);
553}
554
555static int hci_create_le_conn(struct hci_conn *conn)
556{
557 struct hci_dev *hdev = conn->hdev;
558 struct hci_cp_le_create_conn cp;
559 struct hci_request req;
560 int err;
561
562 hci_req_init(&req, hdev);
563
564 memset(&cp, 0, sizeof(cp));
565 cp.scan_interval = __constant_cpu_to_le16(0x0060);
566 cp.scan_window = __constant_cpu_to_le16(0x0030);
567 bacpy(&cp.peer_addr, &conn->dst);
568 cp.peer_addr_type = conn->dst_type;
569 if (bacmp(&hdev->bdaddr, BDADDR_ANY))
570 cp.own_address_type = ADDR_LE_DEV_PUBLIC;
571 else
572 cp.own_address_type = ADDR_LE_DEV_RANDOM;
573 cp.conn_interval_min = __constant_cpu_to_le16(0x0028);
574 cp.conn_interval_max = __constant_cpu_to_le16(0x0038);
575 cp.supervision_timeout = __constant_cpu_to_le16(0x002a);
576 cp.min_ce_len = __constant_cpu_to_le16(0x0000);
577 cp.max_ce_len = __constant_cpu_to_le16(0x0000);
578 hci_req_add(&req, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
579
580 err = hci_req_run(&req, create_le_conn_complete);
581 if (err) {
582 hci_conn_del(conn);
583 return err;
584 }
585
586 return 0;
587}
588
d04aef4c
VCG
589static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
590 u8 dst_type, u8 sec_level, u8 auth_type)
1da177e4 591{
f1e5d547 592 struct hci_conn *conn;
1d399ae5 593 int err;
1da177e4 594
f3d3444a 595 if (test_bit(HCI_ADVERTISING, &hdev->flags))
f1550478
JH
596 return ERR_PTR(-ENOTSUPP);
597
620ad521
AG
598 /* Some devices send ATT messages as soon as the physical link is
599 * established. To be able to handle these ATT messages, the user-
600 * space first establishes the connection and then starts the pairing
601 * process.
602 *
603 * So if a hci_conn object already exists for the following connection
604 * attempt, we simply update pending_sec_level and auth_type fields
605 * and return the object found.
606 */
f1e5d547 607 conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
620ad521
AG
608 if (conn) {
609 conn->pending_sec_level = sec_level;
610 conn->auth_type = auth_type;
611 goto done;
612 }
dfc94dbd 613
620ad521
AG
614 /* Since the controller supports only one LE connection attempt at a
615 * time, we return -EBUSY if there is any connection attempt running.
616 */
617 conn = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
618 if (conn)
619 return ERR_PTR(-EBUSY);
46a190cb 620
620ad521
AG
621 conn = hci_conn_add(hdev, LE_LINK, dst);
622 if (!conn)
623 return ERR_PTR(-ENOMEM);
9f0caeb1 624
620ad521
AG
625 conn->dst_type = bdaddr_to_le(dst_type);
626 conn->state = BT_CONNECT;
627 conn->out = true;
628 conn->link_mode |= HCI_LM_MASTER;
629 conn->sec_level = BT_SECURITY_LOW;
f1e5d547
AG
630 conn->pending_sec_level = sec_level;
631 conn->auth_type = auth_type;
eda42b50 632
620ad521
AG
633 err = hci_create_le_conn(conn);
634 if (err)
635 return ERR_PTR(err);
fcd89c09 636
620ad521
AG
637done:
638 hci_conn_hold(conn);
f1e5d547 639 return conn;
d04aef4c 640}
fcd89c09 641
db474275
VCG
642static struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
643 u8 sec_level, u8 auth_type)
1da177e4
LT
644{
645 struct hci_conn *acl;
fcd89c09 646
56f87901
JH
647 if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
648 return ERR_PTR(-ENOTSUPP);
649
70f23020
AE
650 acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
651 if (!acl) {
652 acl = hci_conn_add(hdev, ACL_LINK, dst);
653 if (!acl)
48c7aba9 654 return ERR_PTR(-ENOMEM);
1da177e4
LT
655 }
656
657 hci_conn_hold(acl);
658
09ab6f4c 659 if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
765c2a96
JH
660 acl->sec_level = BT_SECURITY_LOW;
661 acl->pending_sec_level = sec_level;
09ab6f4c 662 acl->auth_type = auth_type;
1aef8669 663 hci_acl_create_connection(acl);
09ab6f4c 664 }
1da177e4 665
db474275
VCG
666 return acl;
667}
668
10c62ddc
FD
669struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
670 __u16 setting)
db474275
VCG
671{
672 struct hci_conn *acl;
673 struct hci_conn *sco;
674
e660ed6c 675 acl = hci_connect_acl(hdev, dst, BT_SECURITY_LOW, HCI_AT_NO_BONDING);
db474275 676 if (IS_ERR(acl))
5b7f9909 677 return acl;
1da177e4 678
70f23020
AE
679 sco = hci_conn_hash_lookup_ba(hdev, type, dst);
680 if (!sco) {
681 sco = hci_conn_add(hdev, type, dst);
682 if (!sco) {
76a68ba0 683 hci_conn_drop(acl);
48c7aba9 684 return ERR_PTR(-ENOMEM);
1da177e4 685 }
5b7f9909 686 }
1da177e4 687
5b7f9909
MH
688 acl->link = sco;
689 sco->link = acl;
1da177e4 690
5b7f9909 691 hci_conn_hold(sco);
1da177e4 692
10c62ddc
FD
693 sco->setting = setting;
694
5b7f9909 695 if (acl->state == BT_CONNECTED &&
5974e4c4 696 (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
58a681ef 697 set_bit(HCI_CONN_POWER_SAVE, &acl->flags);
14b12d0b 698 hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON);
c390216b 699
51a8efd7 700 if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) {
e73439d8 701 /* defer SCO setup until mode change completed */
51a8efd7 702 set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags);
e73439d8
MH
703 return sco;
704 }
705
706 hci_sco_setup(acl, 0x00);
b6a0dc82 707 }
5b7f9909
MH
708
709 return sco;
1da177e4 710}
1da177e4 711
b7d839bf
VCG
712/* Create SCO, ACL or LE connection. */
713struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
714 __u8 dst_type, __u8 sec_level, __u8 auth_type)
715{
6ed93dc6 716 BT_DBG("%s dst %pMR type 0x%x", hdev->name, dst, type);
b7d839bf 717
4cd2d983
VCG
718 switch (type) {
719 case LE_LINK:
b7d839bf 720 return hci_connect_le(hdev, dst, dst_type, sec_level, auth_type);
4cd2d983 721 case ACL_LINK:
b7d839bf 722 return hci_connect_acl(hdev, dst, sec_level, auth_type);
4cd2d983 723 }
b7d839bf 724
4cd2d983 725 return ERR_PTR(-EINVAL);
b7d839bf
VCG
726}
727
e7c29cb1
MH
728/* Check link security requirement */
729int hci_conn_check_link_mode(struct hci_conn *conn)
730{
38b3fef1 731 BT_DBG("hcon %p", conn);
e7c29cb1 732
aa64a8b5 733 if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
e7c29cb1
MH
734 return 0;
735
736 return 1;
737}
e7c29cb1 738
1da177e4 739/* Authenticate remote device */
0684e5f9 740static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
1da177e4 741{
38b3fef1 742 BT_DBG("hcon %p", conn);
1da177e4 743
765c2a96
JH
744 if (conn->pending_sec_level > sec_level)
745 sec_level = conn->pending_sec_level;
746
96a31833 747 if (sec_level > conn->sec_level)
765c2a96 748 conn->pending_sec_level = sec_level;
96a31833 749 else if (conn->link_mode & HCI_LM_AUTH)
1da177e4
LT
750 return 1;
751
65cf686e
JH
752 /* Make sure we preserve an existing MITM requirement*/
753 auth_type |= (conn->auth_type & 0x01);
754
96a31833
MH
755 conn->auth_type = auth_type;
756
51a8efd7 757 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
1da177e4 758 struct hci_cp_auth_requested cp;
b7d05bad
PH
759
760 /* encrypt must be pending if auth is also pending */
761 set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);
762
aca3192c 763 cp.handle = cpu_to_le16(conn->handle);
40be492f 764 hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
5974e4c4 765 sizeof(cp), &cp);
19f8def0 766 if (conn->key_type != 0xff)
51a8efd7 767 set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
1da177e4 768 }
8c1b2355 769
1da177e4
LT
770 return 0;
771}
1da177e4 772
13d39315
WR
773/* Encrypt the the link */
774static void hci_conn_encrypt(struct hci_conn *conn)
775{
38b3fef1 776 BT_DBG("hcon %p", conn);
13d39315 777
51a8efd7 778 if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
13d39315
WR
779 struct hci_cp_set_conn_encrypt cp;
780 cp.handle = cpu_to_le16(conn->handle);
781 cp.encrypt = 0x01;
782 hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
5974e4c4 783 &cp);
13d39315
WR
784 }
785}
786
8c1b2355 787/* Enable security */
0684e5f9 788int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
1da177e4 789{
38b3fef1 790 BT_DBG("hcon %p", conn);
1da177e4 791
d8343f12
VCG
792 if (conn->type == LE_LINK)
793 return smp_conn_security(conn, sec_level);
794
13d39315 795 /* For sdp we don't need the link key. */
8c1b2355
MH
796 if (sec_level == BT_SECURITY_SDP)
797 return 1;
798
13d39315
WR
799 /* For non 2.1 devices and low security level we don't need the link
800 key. */
aa64a8b5 801 if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
3fdca1e1 802 return 1;
8c1b2355 803
13d39315
WR
804 /* For other security levels we need the link key. */
805 if (!(conn->link_mode & HCI_LM_AUTH))
806 goto auth;
807
808 /* An authenticated combination key has sufficient security for any
809 security level. */
810 if (conn->key_type == HCI_LK_AUTH_COMBINATION)
811 goto encrypt;
812
813 /* An unauthenticated combination key has sufficient security for
814 security level 1 and 2. */
815 if (conn->key_type == HCI_LK_UNAUTH_COMBINATION &&
5974e4c4 816 (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW))
13d39315
WR
817 goto encrypt;
818
819 /* A combination key has always sufficient security for the security
820 levels 1 or 2. High security level requires the combination key
821 is generated using maximum PIN code length (16).
822 For pre 2.1 units. */
823 if (conn->key_type == HCI_LK_COMBINATION &&
5974e4c4 824 (sec_level != BT_SECURITY_HIGH || conn->pin_length == 16))
13d39315
WR
825 goto encrypt;
826
827auth:
51a8efd7 828 if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
1da177e4
LT
829 return 0;
830
6fdf658c
LAD
831 if (!hci_conn_auth(conn, sec_level, auth_type))
832 return 0;
13d39315
WR
833
834encrypt:
835 if (conn->link_mode & HCI_LM_ENCRYPT)
836 return 1;
8c1b2355 837
13d39315 838 hci_conn_encrypt(conn);
1da177e4
LT
839 return 0;
840}
8c1b2355 841EXPORT_SYMBOL(hci_conn_security);
1da177e4 842
b3b1b061
WR
843/* Check secure link requirement */
844int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level)
845{
38b3fef1 846 BT_DBG("hcon %p", conn);
b3b1b061
WR
847
848 if (sec_level != BT_SECURITY_HIGH)
849 return 1; /* Accept if non-secure is required */
850
ef4177e2 851 if (conn->sec_level == BT_SECURITY_HIGH)
b3b1b061
WR
852 return 1;
853
854 return 0; /* Reject not secure link */
855}
856EXPORT_SYMBOL(hci_conn_check_secure);
857
1da177e4
LT
858/* Change link key */
859int hci_conn_change_link_key(struct hci_conn *conn)
860{
38b3fef1 861 BT_DBG("hcon %p", conn);
1da177e4 862
51a8efd7 863 if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
1da177e4 864 struct hci_cp_change_conn_link_key cp;
aca3192c 865 cp.handle = cpu_to_le16(conn->handle);
40be492f 866 hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
5974e4c4 867 sizeof(cp), &cp);
1da177e4 868 }
8c1b2355 869
1da177e4
LT
870 return 0;
871}
1da177e4
LT
872
873/* Switch role */
8c1b2355 874int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
1da177e4 875{
38b3fef1 876 BT_DBG("hcon %p", conn);
1da177e4
LT
877
878 if (!role && conn->link_mode & HCI_LM_MASTER)
879 return 1;
880
51a8efd7 881 if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
1da177e4
LT
882 struct hci_cp_switch_role cp;
883 bacpy(&cp.bdaddr, &conn->dst);
884 cp.role = role;
a9de9248 885 hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
1da177e4 886 }
8c1b2355 887
1da177e4
LT
888 return 0;
889}
890EXPORT_SYMBOL(hci_conn_switch_role);
891
04837f64 892/* Enter active mode */
14b12d0b 893void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
04837f64
MH
894{
895 struct hci_dev *hdev = conn->hdev;
896
38b3fef1 897 BT_DBG("hcon %p mode %d", conn, conn->mode);
04837f64
MH
898
899 if (test_bit(HCI_RAW, &hdev->flags))
900 return;
901
14b12d0b
JG
902 if (conn->mode != HCI_CM_SNIFF)
903 goto timer;
904
58a681ef 905 if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active)
04837f64
MH
906 goto timer;
907
51a8efd7 908 if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
04837f64 909 struct hci_cp_exit_sniff_mode cp;
aca3192c 910 cp.handle = cpu_to_le16(conn->handle);
a9de9248 911 hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
04837f64
MH
912 }
913
914timer:
915 if (hdev->idle_timeout > 0)
916 mod_timer(&conn->idle_timer,
5974e4c4 917 jiffies + msecs_to_jiffies(hdev->idle_timeout));
04837f64
MH
918}
919
1da177e4
LT
920/* Drop all connection on the device */
921void hci_conn_hash_flush(struct hci_dev *hdev)
922{
923 struct hci_conn_hash *h = &hdev->conn_hash;
3c4e0df0 924 struct hci_conn *c, *n;
1da177e4
LT
925
926 BT_DBG("hdev %s", hdev->name);
927
3c4e0df0 928 list_for_each_entry_safe(c, n, &h->list, list) {
1da177e4
LT
929 c->state = BT_CLOSED;
930
9f5a0d7b 931 hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
1da177e4
LT
932 hci_conn_del(c);
933 }
934}
935
a9de9248
MH
936/* Check pending connect attempts */
937void hci_conn_check_pending(struct hci_dev *hdev)
938{
939 struct hci_conn *conn;
940
941 BT_DBG("hdev %s", hdev->name);
942
943 hci_dev_lock(hdev);
944
945 conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
946 if (conn)
1aef8669 947 hci_acl_create_connection(conn);
a9de9248
MH
948
949 hci_dev_unlock(hdev);
950}
951
1da177e4
LT
952int hci_get_conn_list(void __user *arg)
953{
fc5fef61 954 struct hci_conn *c;
1da177e4
LT
955 struct hci_conn_list_req req, *cl;
956 struct hci_conn_info *ci;
957 struct hci_dev *hdev;
1da177e4
LT
958 int n = 0, size, err;
959
960 if (copy_from_user(&req, arg, sizeof(req)))
961 return -EFAULT;
962
963 if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
964 return -EINVAL;
965
966 size = sizeof(req) + req.conn_num * sizeof(*ci);
967
70f23020
AE
968 cl = kmalloc(size, GFP_KERNEL);
969 if (!cl)
1da177e4
LT
970 return -ENOMEM;
971
70f23020
AE
972 hdev = hci_dev_get(req.dev_id);
973 if (!hdev) {
1da177e4
LT
974 kfree(cl);
975 return -ENODEV;
976 }
977
978 ci = cl->conn_info;
979
09fd0de5 980 hci_dev_lock(hdev);
8035ded4 981 list_for_each_entry(c, &hdev->conn_hash.list, list) {
1da177e4
LT
982 bacpy(&(ci + n)->bdaddr, &c->dst);
983 (ci + n)->handle = c->handle;
984 (ci + n)->type = c->type;
985 (ci + n)->out = c->out;
986 (ci + n)->state = c->state;
987 (ci + n)->link_mode = c->link_mode;
988 if (++n >= req.conn_num)
989 break;
990 }
09fd0de5 991 hci_dev_unlock(hdev);
1da177e4
LT
992
993 cl->dev_id = hdev->id;
994 cl->conn_num = n;
995 size = sizeof(req) + n * sizeof(*ci);
996
997 hci_dev_put(hdev);
998
999 err = copy_to_user(arg, cl, size);
1000 kfree(cl);
1001
1002 return err ? -EFAULT : 0;
1003}
1004
1005int hci_get_conn_info(struct hci_dev *hdev, void __user *arg)
1006{
1007 struct hci_conn_info_req req;
1008 struct hci_conn_info ci;
1009 struct hci_conn *conn;
1010 char __user *ptr = arg + sizeof(req);
1011
1012 if (copy_from_user(&req, arg, sizeof(req)))
1013 return -EFAULT;
1014
09fd0de5 1015 hci_dev_lock(hdev);
1da177e4
LT
1016 conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
1017 if (conn) {
1018 bacpy(&ci.bdaddr, &conn->dst);
1019 ci.handle = conn->handle;
1020 ci.type = conn->type;
1021 ci.out = conn->out;
1022 ci.state = conn->state;
1023 ci.link_mode = conn->link_mode;
1024 }
09fd0de5 1025 hci_dev_unlock(hdev);
1da177e4
LT
1026
1027 if (!conn)
1028 return -ENOENT;
1029
1030 return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
1031}
40be492f
MH
1032
1033int hci_get_auth_info(struct hci_dev *hdev, void __user *arg)
1034{
1035 struct hci_auth_info_req req;
1036 struct hci_conn *conn;
1037
1038 if (copy_from_user(&req, arg, sizeof(req)))
1039 return -EFAULT;
1040
09fd0de5 1041 hci_dev_lock(hdev);
40be492f
MH
1042 conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
1043 if (conn)
1044 req.type = conn->auth_type;
09fd0de5 1045 hci_dev_unlock(hdev);
40be492f
MH
1046
1047 if (!conn)
1048 return -ENOENT;
1049
1050 return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
1051}
73d80deb
LAD
1052
1053struct hci_chan *hci_chan_create(struct hci_conn *conn)
1054{
1055 struct hci_dev *hdev = conn->hdev;
1056 struct hci_chan *chan;
1057
38b3fef1 1058 BT_DBG("%s hcon %p", hdev->name, conn);
73d80deb 1059
75d7735c 1060 chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
73d80deb
LAD
1061 if (!chan)
1062 return NULL;
1063
1064 chan->conn = conn;
1065 skb_queue_head_init(&chan->data_q);
168df8e5 1066 chan->state = BT_CONNECTED;
73d80deb 1067
8192edef 1068 list_add_rcu(&chan->list, &conn->chan_list);
73d80deb
LAD
1069
1070 return chan;
1071}
1072
9472007c 1073void hci_chan_del(struct hci_chan *chan)
73d80deb
LAD
1074{
1075 struct hci_conn *conn = chan->conn;
1076 struct hci_dev *hdev = conn->hdev;
1077
38b3fef1 1078 BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan);
73d80deb 1079
8192edef
GP
1080 list_del_rcu(&chan->list);
1081
1082 synchronize_rcu();
73d80deb 1083
76a68ba0 1084 hci_conn_drop(conn);
e9b02748 1085
73d80deb
LAD
1086 skb_queue_purge(&chan->data_q);
1087 kfree(chan);
73d80deb
LAD
1088}
1089
2c33c06a 1090void hci_chan_list_flush(struct hci_conn *conn)
73d80deb 1091{
2a5a5ec6 1092 struct hci_chan *chan, *n;
73d80deb 1093
38b3fef1 1094 BT_DBG("hcon %p", conn);
73d80deb 1095
2a5a5ec6 1096 list_for_each_entry_safe(chan, n, &conn->chan_list, list)
73d80deb
LAD
1097 hci_chan_del(chan);
1098}
42c4e53e
AE
1099
1100static struct hci_chan *__hci_chan_lookup_handle(struct hci_conn *hcon,
1101 __u16 handle)
1102{
1103 struct hci_chan *hchan;
1104
1105 list_for_each_entry(hchan, &hcon->chan_list, list) {
1106 if (hchan->handle == handle)
1107 return hchan;
1108 }
1109
1110 return NULL;
1111}
1112
1113struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle)
1114{
1115 struct hci_conn_hash *h = &hdev->conn_hash;
1116 struct hci_conn *hcon;
1117 struct hci_chan *hchan = NULL;
1118
1119 rcu_read_lock();
1120
1121 list_for_each_entry_rcu(hcon, &h->list, list) {
1122 hchan = __hci_chan_lookup_handle(hcon, handle);
1123 if (hchan)
1124 break;
1125 }
1126
1127 rcu_read_unlock();
1128
1129 return hchan;
1130}
This page took 0.753143 seconds and 5 git commands to generate.