xref: /openbmc/linux/net/bluetooth/hci_conn.c (revision 7dd65feb)
1 /*
2    BlueZ - Bluetooth protocol stack for Linux
3    Copyright (C) 2000-2001 Qualcomm Incorporated
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
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
18    OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19 
20    ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
21    COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
22    SOFTWARE IS DISCLAIMED.
23 */
24 
25 /* Bluetooth HCI connection handling. */
26 
27 #include <linux/module.h>
28 
29 #include <linux/types.h>
30 #include <linux/errno.h>
31 #include <linux/kernel.h>
32 #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>
42 #include <asm/uaccess.h>
43 #include <asm/unaligned.h>
44 
45 #include <net/bluetooth/bluetooth.h>
46 #include <net/bluetooth/hci_core.h>
47 
48 void hci_acl_connect(struct hci_conn *conn)
49 {
50 	struct hci_dev *hdev = conn->hdev;
51 	struct inquiry_entry *ie;
52 	struct hci_cp_create_conn cp;
53 
54 	BT_DBG("%p", conn);
55 
56 	conn->state = BT_CONNECT;
57 	conn->out = 1;
58 
59 	conn->link_mode = HCI_LM_MASTER;
60 
61 	conn->attempt++;
62 
63 	conn->link_policy = hdev->link_policy;
64 
65 	memset(&cp, 0, sizeof(cp));
66 	bacpy(&cp.bdaddr, &conn->dst);
67 	cp.pscan_rep_mode = 0x02;
68 
69 	if ((ie = hci_inquiry_cache_lookup(hdev, &conn->dst))) {
70 		if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
71 			cp.pscan_rep_mode = ie->data.pscan_rep_mode;
72 			cp.pscan_mode     = ie->data.pscan_mode;
73 			cp.clock_offset   = ie->data.clock_offset |
74 							cpu_to_le16(0x8000);
75 		}
76 
77 		memcpy(conn->dev_class, ie->data.dev_class, 3);
78 		conn->ssp_mode = ie->data.ssp_mode;
79 	}
80 
81 	cp.pkt_type = cpu_to_le16(conn->pkt_type);
82 	if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
83 		cp.role_switch = 0x01;
84 	else
85 		cp.role_switch = 0x00;
86 
87 	hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
88 }
89 
90 static void hci_acl_connect_cancel(struct hci_conn *conn)
91 {
92 	struct hci_cp_create_conn_cancel cp;
93 
94 	BT_DBG("%p", conn);
95 
96 	if (conn->hdev->hci_ver < 2)
97 		return;
98 
99 	bacpy(&cp.bdaddr, &conn->dst);
100 	hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp);
101 }
102 
103 void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
104 {
105 	struct hci_cp_disconnect cp;
106 
107 	BT_DBG("%p", conn);
108 
109 	conn->state = BT_DISCONN;
110 
111 	cp.handle = cpu_to_le16(conn->handle);
112 	cp.reason = reason;
113 	hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
114 }
115 
116 void hci_add_sco(struct hci_conn *conn, __u16 handle)
117 {
118 	struct hci_dev *hdev = conn->hdev;
119 	struct hci_cp_add_sco cp;
120 
121 	BT_DBG("%p", conn);
122 
123 	conn->state = BT_CONNECT;
124 	conn->out = 1;
125 
126 	conn->attempt++;
127 
128 	cp.handle   = cpu_to_le16(handle);
129 	cp.pkt_type = cpu_to_le16(conn->pkt_type);
130 
131 	hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
132 }
133 
134 void hci_setup_sync(struct hci_conn *conn, __u16 handle)
135 {
136 	struct hci_dev *hdev = conn->hdev;
137 	struct hci_cp_setup_sync_conn cp;
138 
139 	BT_DBG("%p", conn);
140 
141 	conn->state = BT_CONNECT;
142 	conn->out = 1;
143 
144 	conn->attempt++;
145 
146 	cp.handle   = cpu_to_le16(handle);
147 	cp.pkt_type = cpu_to_le16(conn->pkt_type);
148 
149 	cp.tx_bandwidth   = cpu_to_le32(0x00001f40);
150 	cp.rx_bandwidth   = cpu_to_le32(0x00001f40);
151 	cp.max_latency    = cpu_to_le16(0xffff);
152 	cp.voice_setting  = cpu_to_le16(hdev->voice_setting);
153 	cp.retrans_effort = 0xff;
154 
155 	hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp);
156 }
157 
158 static void hci_conn_timeout(unsigned long arg)
159 {
160 	struct hci_conn *conn = (void *) arg;
161 	struct hci_dev *hdev = conn->hdev;
162 	__u8 reason;
163 
164 	BT_DBG("conn %p state %d", conn, conn->state);
165 
166 	if (atomic_read(&conn->refcnt))
167 		return;
168 
169 	hci_dev_lock(hdev);
170 
171 	switch (conn->state) {
172 	case BT_CONNECT:
173 	case BT_CONNECT2:
174 		if (conn->type == ACL_LINK && conn->out)
175 			hci_acl_connect_cancel(conn);
176 		break;
177 	case BT_CONFIG:
178 	case BT_CONNECTED:
179 		reason = hci_proto_disconn_ind(conn);
180 		hci_acl_disconn(conn, reason);
181 		break;
182 	default:
183 		conn->state = BT_CLOSED;
184 		break;
185 	}
186 
187 	hci_dev_unlock(hdev);
188 }
189 
190 static void hci_conn_idle(unsigned long arg)
191 {
192 	struct hci_conn *conn = (void *) arg;
193 
194 	BT_DBG("conn %p mode %d", conn, conn->mode);
195 
196 	hci_conn_enter_sniff_mode(conn);
197 }
198 
199 struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
200 {
201 	struct hci_conn *conn;
202 
203 	BT_DBG("%s dst %s", hdev->name, batostr(dst));
204 
205 	conn = kzalloc(sizeof(struct hci_conn), GFP_ATOMIC);
206 	if (!conn)
207 		return NULL;
208 
209 	bacpy(&conn->dst, dst);
210 	conn->hdev  = hdev;
211 	conn->type  = type;
212 	conn->mode  = HCI_CM_ACTIVE;
213 	conn->state = BT_OPEN;
214 	conn->auth_type = HCI_AT_GENERAL_BONDING;
215 
216 	conn->power_save = 1;
217 	conn->disc_timeout = HCI_DISCONN_TIMEOUT;
218 
219 	switch (type) {
220 	case ACL_LINK:
221 		conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
222 		break;
223 	case SCO_LINK:
224 		if (lmp_esco_capable(hdev))
225 			conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
226 					(hdev->esco_type & EDR_ESCO_MASK);
227 		else
228 			conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
229 		break;
230 	case ESCO_LINK:
231 		conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
232 		break;
233 	}
234 
235 	skb_queue_head_init(&conn->data_q);
236 
237 	setup_timer(&conn->disc_timer, hci_conn_timeout, (unsigned long)conn);
238 	setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
239 
240 	atomic_set(&conn->refcnt, 0);
241 
242 	hci_dev_hold(hdev);
243 
244 	tasklet_disable(&hdev->tx_task);
245 
246 	hci_conn_hash_add(hdev, conn);
247 	if (hdev->notify)
248 		hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);
249 
250 	atomic_set(&conn->devref, 0);
251 
252 	hci_conn_init_sysfs(conn);
253 
254 	tasklet_enable(&hdev->tx_task);
255 
256 	return conn;
257 }
258 
259 int hci_conn_del(struct hci_conn *conn)
260 {
261 	struct hci_dev *hdev = conn->hdev;
262 
263 	BT_DBG("%s conn %p handle %d", hdev->name, conn, conn->handle);
264 
265 	del_timer(&conn->idle_timer);
266 
267 	del_timer(&conn->disc_timer);
268 
269 	if (conn->type == ACL_LINK) {
270 		struct hci_conn *sco = conn->link;
271 		if (sco)
272 			sco->link = NULL;
273 
274 		/* Unacked frames */
275 		hdev->acl_cnt += conn->sent;
276 	} else {
277 		struct hci_conn *acl = conn->link;
278 		if (acl) {
279 			acl->link = NULL;
280 			hci_conn_put(acl);
281 		}
282 	}
283 
284 	tasklet_disable(&hdev->tx_task);
285 
286 	hci_conn_hash_del(hdev, conn);
287 	if (hdev->notify)
288 		hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
289 
290 	tasklet_enable(&hdev->tx_task);
291 
292 	skb_queue_purge(&conn->data_q);
293 
294 	hci_conn_put_device(conn);
295 
296 	hci_dev_put(hdev);
297 
298 	return 0;
299 }
300 
301 struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
302 {
303 	int use_src = bacmp(src, BDADDR_ANY);
304 	struct hci_dev *hdev = NULL;
305 	struct list_head *p;
306 
307 	BT_DBG("%s -> %s", batostr(src), batostr(dst));
308 
309 	read_lock_bh(&hci_dev_list_lock);
310 
311 	list_for_each(p, &hci_dev_list) {
312 		struct hci_dev *d = list_entry(p, struct hci_dev, list);
313 
314 		if (!test_bit(HCI_UP, &d->flags) || test_bit(HCI_RAW, &d->flags))
315 			continue;
316 
317 		/* Simple routing:
318 		 *   No source address - find interface with bdaddr != dst
319 		 *   Source address    - find interface with bdaddr == src
320 		 */
321 
322 		if (use_src) {
323 			if (!bacmp(&d->bdaddr, src)) {
324 				hdev = d; break;
325 			}
326 		} else {
327 			if (bacmp(&d->bdaddr, dst)) {
328 				hdev = d; break;
329 			}
330 		}
331 	}
332 
333 	if (hdev)
334 		hdev = hci_dev_hold(hdev);
335 
336 	read_unlock_bh(&hci_dev_list_lock);
337 	return hdev;
338 }
339 EXPORT_SYMBOL(hci_get_route);
340 
341 /* Create SCO or ACL connection.
342  * Device _must_ be locked */
343 struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst, __u8 sec_level, __u8 auth_type)
344 {
345 	struct hci_conn *acl;
346 	struct hci_conn *sco;
347 
348 	BT_DBG("%s dst %s", hdev->name, batostr(dst));
349 
350 	if (!(acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst))) {
351 		if (!(acl = hci_conn_add(hdev, ACL_LINK, dst)))
352 			return NULL;
353 	}
354 
355 	hci_conn_hold(acl);
356 
357 	if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
358 		acl->sec_level = sec_level;
359 		acl->auth_type = auth_type;
360 		hci_acl_connect(acl);
361 	}
362 
363 	if (type == ACL_LINK)
364 		return acl;
365 
366 	if (!(sco = hci_conn_hash_lookup_ba(hdev, type, dst))) {
367 		if (!(sco = hci_conn_add(hdev, type, dst))) {
368 			hci_conn_put(acl);
369 			return NULL;
370 		}
371 	}
372 
373 	acl->link = sco;
374 	sco->link = acl;
375 
376 	hci_conn_hold(sco);
377 
378 	if (acl->state == BT_CONNECTED &&
379 			(sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
380 		if (lmp_esco_capable(hdev))
381 			hci_setup_sync(sco, acl->handle);
382 		else
383 			hci_add_sco(sco, acl->handle);
384 	}
385 
386 	return sco;
387 }
388 EXPORT_SYMBOL(hci_connect);
389 
390 /* Check link security requirement */
391 int hci_conn_check_link_mode(struct hci_conn *conn)
392 {
393 	BT_DBG("conn %p", conn);
394 
395 	if (conn->ssp_mode > 0 && conn->hdev->ssp_mode > 0 &&
396 					!(conn->link_mode & HCI_LM_ENCRYPT))
397 		return 0;
398 
399 	return 1;
400 }
401 EXPORT_SYMBOL(hci_conn_check_link_mode);
402 
403 /* Authenticate remote device */
404 static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
405 {
406 	BT_DBG("conn %p", conn);
407 
408 	if (sec_level > conn->sec_level)
409 		conn->sec_level = sec_level;
410 	else if (conn->link_mode & HCI_LM_AUTH)
411 		return 1;
412 
413 	conn->auth_type = auth_type;
414 
415 	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
416 		struct hci_cp_auth_requested cp;
417 		cp.handle = cpu_to_le16(conn->handle);
418 		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
419 							sizeof(cp), &cp);
420 	}
421 
422 	return 0;
423 }
424 
425 /* Enable security */
426 int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
427 {
428 	BT_DBG("conn %p", conn);
429 
430 	if (sec_level == BT_SECURITY_SDP)
431 		return 1;
432 
433 	if (sec_level == BT_SECURITY_LOW &&
434 				(!conn->ssp_mode || !conn->hdev->ssp_mode))
435 		return 1;
436 
437 	if (conn->link_mode & HCI_LM_ENCRYPT)
438 		return hci_conn_auth(conn, sec_level, auth_type);
439 
440 	if (test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->pend))
441 		return 0;
442 
443 	if (hci_conn_auth(conn, sec_level, auth_type)) {
444 		struct hci_cp_set_conn_encrypt cp;
445 		cp.handle  = cpu_to_le16(conn->handle);
446 		cp.encrypt = 1;
447 		hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT,
448 							sizeof(cp), &cp);
449 	}
450 
451 	return 0;
452 }
453 EXPORT_SYMBOL(hci_conn_security);
454 
455 /* Change link key */
456 int hci_conn_change_link_key(struct hci_conn *conn)
457 {
458 	BT_DBG("conn %p", conn);
459 
460 	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->pend)) {
461 		struct hci_cp_change_conn_link_key cp;
462 		cp.handle = cpu_to_le16(conn->handle);
463 		hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
464 							sizeof(cp), &cp);
465 	}
466 
467 	return 0;
468 }
469 EXPORT_SYMBOL(hci_conn_change_link_key);
470 
471 /* Switch role */
472 int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
473 {
474 	BT_DBG("conn %p", conn);
475 
476 	if (!role && conn->link_mode & HCI_LM_MASTER)
477 		return 1;
478 
479 	if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->pend)) {
480 		struct hci_cp_switch_role cp;
481 		bacpy(&cp.bdaddr, &conn->dst);
482 		cp.role = role;
483 		hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
484 	}
485 
486 	return 0;
487 }
488 EXPORT_SYMBOL(hci_conn_switch_role);
489 
490 /* Enter active mode */
491 void hci_conn_enter_active_mode(struct hci_conn *conn)
492 {
493 	struct hci_dev *hdev = conn->hdev;
494 
495 	BT_DBG("conn %p mode %d", conn, conn->mode);
496 
497 	if (test_bit(HCI_RAW, &hdev->flags))
498 		return;
499 
500 	if (conn->mode != HCI_CM_SNIFF || !conn->power_save)
501 		goto timer;
502 
503 	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) {
504 		struct hci_cp_exit_sniff_mode cp;
505 		cp.handle = cpu_to_le16(conn->handle);
506 		hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
507 	}
508 
509 timer:
510 	if (hdev->idle_timeout > 0)
511 		mod_timer(&conn->idle_timer,
512 			jiffies + msecs_to_jiffies(hdev->idle_timeout));
513 }
514 
515 /* Enter sniff mode */
516 void hci_conn_enter_sniff_mode(struct hci_conn *conn)
517 {
518 	struct hci_dev *hdev = conn->hdev;
519 
520 	BT_DBG("conn %p mode %d", conn, conn->mode);
521 
522 	if (test_bit(HCI_RAW, &hdev->flags))
523 		return;
524 
525 	if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn))
526 		return;
527 
528 	if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF))
529 		return;
530 
531 	if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) {
532 		struct hci_cp_sniff_subrate cp;
533 		cp.handle             = cpu_to_le16(conn->handle);
534 		cp.max_latency        = cpu_to_le16(0);
535 		cp.min_remote_timeout = cpu_to_le16(0);
536 		cp.min_local_timeout  = cpu_to_le16(0);
537 		hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
538 	}
539 
540 	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->pend)) {
541 		struct hci_cp_sniff_mode cp;
542 		cp.handle       = cpu_to_le16(conn->handle);
543 		cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
544 		cp.min_interval = cpu_to_le16(hdev->sniff_min_interval);
545 		cp.attempt      = cpu_to_le16(4);
546 		cp.timeout      = cpu_to_le16(1);
547 		hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
548 	}
549 }
550 
551 /* Drop all connection on the device */
552 void hci_conn_hash_flush(struct hci_dev *hdev)
553 {
554 	struct hci_conn_hash *h = &hdev->conn_hash;
555 	struct list_head *p;
556 
557 	BT_DBG("hdev %s", hdev->name);
558 
559 	p = h->list.next;
560 	while (p != &h->list) {
561 		struct hci_conn *c;
562 
563 		c = list_entry(p, struct hci_conn, list);
564 		p = p->next;
565 
566 		c->state = BT_CLOSED;
567 
568 		hci_proto_disconn_cfm(c, 0x16);
569 		hci_conn_del(c);
570 	}
571 }
572 
573 /* Check pending connect attempts */
574 void hci_conn_check_pending(struct hci_dev *hdev)
575 {
576 	struct hci_conn *conn;
577 
578 	BT_DBG("hdev %s", hdev->name);
579 
580 	hci_dev_lock(hdev);
581 
582 	conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
583 	if (conn)
584 		hci_acl_connect(conn);
585 
586 	hci_dev_unlock(hdev);
587 }
588 
589 void hci_conn_hold_device(struct hci_conn *conn)
590 {
591 	atomic_inc(&conn->devref);
592 }
593 EXPORT_SYMBOL(hci_conn_hold_device);
594 
595 void hci_conn_put_device(struct hci_conn *conn)
596 {
597 	if (atomic_dec_and_test(&conn->devref))
598 		hci_conn_del_sysfs(conn);
599 }
600 EXPORT_SYMBOL(hci_conn_put_device);
601 
602 int hci_get_conn_list(void __user *arg)
603 {
604 	struct hci_conn_list_req req, *cl;
605 	struct hci_conn_info *ci;
606 	struct hci_dev *hdev;
607 	struct list_head *p;
608 	int n = 0, size, err;
609 
610 	if (copy_from_user(&req, arg, sizeof(req)))
611 		return -EFAULT;
612 
613 	if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
614 		return -EINVAL;
615 
616 	size = sizeof(req) + req.conn_num * sizeof(*ci);
617 
618 	if (!(cl = kmalloc(size, GFP_KERNEL)))
619 		return -ENOMEM;
620 
621 	if (!(hdev = hci_dev_get(req.dev_id))) {
622 		kfree(cl);
623 		return -ENODEV;
624 	}
625 
626 	ci = cl->conn_info;
627 
628 	hci_dev_lock_bh(hdev);
629 	list_for_each(p, &hdev->conn_hash.list) {
630 		register struct hci_conn *c;
631 		c = list_entry(p, struct hci_conn, list);
632 
633 		bacpy(&(ci + n)->bdaddr, &c->dst);
634 		(ci + n)->handle = c->handle;
635 		(ci + n)->type  = c->type;
636 		(ci + n)->out   = c->out;
637 		(ci + n)->state = c->state;
638 		(ci + n)->link_mode = c->link_mode;
639 		if (++n >= req.conn_num)
640 			break;
641 	}
642 	hci_dev_unlock_bh(hdev);
643 
644 	cl->dev_id = hdev->id;
645 	cl->conn_num = n;
646 	size = sizeof(req) + n * sizeof(*ci);
647 
648 	hci_dev_put(hdev);
649 
650 	err = copy_to_user(arg, cl, size);
651 	kfree(cl);
652 
653 	return err ? -EFAULT : 0;
654 }
655 
656 int hci_get_conn_info(struct hci_dev *hdev, void __user *arg)
657 {
658 	struct hci_conn_info_req req;
659 	struct hci_conn_info ci;
660 	struct hci_conn *conn;
661 	char __user *ptr = arg + sizeof(req);
662 
663 	if (copy_from_user(&req, arg, sizeof(req)))
664 		return -EFAULT;
665 
666 	hci_dev_lock_bh(hdev);
667 	conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
668 	if (conn) {
669 		bacpy(&ci.bdaddr, &conn->dst);
670 		ci.handle = conn->handle;
671 		ci.type  = conn->type;
672 		ci.out   = conn->out;
673 		ci.state = conn->state;
674 		ci.link_mode = conn->link_mode;
675 	}
676 	hci_dev_unlock_bh(hdev);
677 
678 	if (!conn)
679 		return -ENOENT;
680 
681 	return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
682 }
683 
684 int hci_get_auth_info(struct hci_dev *hdev, void __user *arg)
685 {
686 	struct hci_auth_info_req req;
687 	struct hci_conn *conn;
688 
689 	if (copy_from_user(&req, arg, sizeof(req)))
690 		return -EFAULT;
691 
692 	hci_dev_lock_bh(hdev);
693 	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
694 	if (conn)
695 		req.type = conn->auth_type;
696 	hci_dev_unlock_bh(hdev);
697 
698 	if (!conn)
699 		return -ENOENT;
700 
701 	return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
702 }
703