hci_conn.c 23.9 KB
Newer Older
1
/*
L
Linus Torvalds 已提交
2
   BlueZ - Bluetooth protocol stack for Linux
3
   Copyright (c) 2000-2001, 2010, Code Aurora Forum. All rights reserved.
L
Linus Torvalds 已提交
4 5 6 7 8 9 10 11 12 13 14

   Written 2000,2001 by Maxim Krasnyansky <maxk@qualcomm.com>

   This program is free software; you can redistribute it and/or modify
   it under the terms of the GNU General Public License version 2 as
   published by the Free Software Foundation;

   THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
   OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF THIRD PARTY RIGHTS.
   IN NO EVENT SHALL THE COPYRIGHT HOLDER(S) AND AUTHOR(S) BE LIABLE FOR ANY
15 16 17
   CLAIM, OR ANY SPECIAL INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES
   WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
   ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
L
Linus Torvalds 已提交
18 19
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

20 21
   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
L
Linus Torvalds 已提交
22 23 24 25 26
   SOFTWARE IS DISCLAIMED.
*/

/* Bluetooth HCI connection handling. */

27
#include <linux/export.h>
L
Linus Torvalds 已提交
28 29 30

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
31
#include <net/bluetooth/a2mp.h>
32
#include <net/bluetooth/smp.h>
L
Linus Torvalds 已提交
33

34
static void hci_le_create_connection(struct hci_conn *conn)
V
Ville Tervo 已提交
35 36 37 38 39
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_le_create_conn cp;

	conn->state = BT_CONNECT;
40
	conn->out = true;
41
	conn->link_mode |= HCI_LM_MASTER;
42
	conn->sec_level = BT_SECURITY_LOW;
V
Ville Tervo 已提交
43 44

	memset(&cp, 0, sizeof(cp));
45 46
	cp.scan_interval = __constant_cpu_to_le16(0x0060);
	cp.scan_window = __constant_cpu_to_le16(0x0030);
V
Ville Tervo 已提交
47
	bacpy(&cp.peer_addr, &conn->dst);
48
	cp.peer_addr_type = conn->dst_type;
49 50 51 52 53
	cp.conn_interval_min = __constant_cpu_to_le16(0x0028);
	cp.conn_interval_max = __constant_cpu_to_le16(0x0038);
	cp.supervision_timeout = __constant_cpu_to_le16(0x002a);
	cp.min_ce_len = __constant_cpu_to_le16(0x0000);
	cp.max_ce_len = __constant_cpu_to_le16(0x0000);
V
Ville Tervo 已提交
54 55 56 57

	hci_send_cmd(hdev, HCI_OP_LE_CREATE_CONN, sizeof(cp), &cp);
}

58
static void hci_le_create_connection_cancel(struct hci_conn *conn)
V
Ville Tervo 已提交
59 60 61 62
{
	hci_send_cmd(conn->hdev, HCI_OP_LE_CREATE_CONN_CANCEL, 0, NULL);
}

63
static void hci_acl_create_connection(struct hci_conn *conn)
L
Linus Torvalds 已提交
64 65 66 67 68
{
	struct hci_dev *hdev = conn->hdev;
	struct inquiry_entry *ie;
	struct hci_cp_create_conn cp;

69
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
70 71

	conn->state = BT_CONNECT;
72
	conn->out = true;
73

L
Linus Torvalds 已提交
74 75
	conn->link_mode = HCI_LM_MASTER;

76 77
	conn->attempt++;

78 79
	conn->link_policy = hdev->link_policy;

L
Linus Torvalds 已提交
80 81 82 83
	memset(&cp, 0, sizeof(cp));
	bacpy(&cp.bdaddr, &conn->dst);
	cp.pscan_rep_mode = 0x02;

A
Andrei Emeltchenko 已提交
84 85
	ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
	if (ie) {
86 87 88 89
		if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
			cp.pscan_rep_mode = ie->data.pscan_rep_mode;
			cp.pscan_mode     = ie->data.pscan_mode;
			cp.clock_offset   = ie->data.clock_offset |
90
					    __constant_cpu_to_le16(0x8000);
91 92
		}

L
Linus Torvalds 已提交
93
		memcpy(conn->dev_class, ie->data.dev_class, 3);
94 95
		if (ie->data.ssp_mode > 0)
			set_bit(HCI_CONN_SSP_ENABLED, &conn->flags);
L
Linus Torvalds 已提交
96 97
	}

98
	cp.pkt_type = cpu_to_le16(conn->pkt_type);
L
Linus Torvalds 已提交
99
	if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
100
		cp.role_switch = 0x01;
L
Linus Torvalds 已提交
101
	else
102
		cp.role_switch = 0x00;
103

104
	hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
L
Linus Torvalds 已提交
105 106
}

107
static void hci_acl_create_connection_cancel(struct hci_conn *conn)
108 109 110
{
	struct hci_cp_create_conn_cancel cp;

111
	BT_DBG("hcon %p", conn);
112

113
	if (conn->hdev->hci_ver < BLUETOOTH_VER_1_2)
114 115 116
		return;

	bacpy(&cp.bdaddr, &conn->dst);
117
	hci_send_cmd(conn->hdev, HCI_OP_CREATE_CONN_CANCEL, sizeof(cp), &cp);
118 119
}

120 121 122 123 124 125 126 127 128 129
static void hci_reject_sco(struct hci_conn *conn)
{
	struct hci_cp_reject_sync_conn_req cp;

	cp.reason = HCI_ERROR_REMOTE_USER_TERM;
	bacpy(&cp.bdaddr, &conn->dst);

	hci_send_cmd(conn->hdev, HCI_OP_REJECT_SYNC_CONN_REQ, sizeof(cp), &cp);
}

A
Andre Guedes 已提交
130
void hci_disconnect(struct hci_conn *conn, __u8 reason)
L
Linus Torvalds 已提交
131 132 133
{
	struct hci_cp_disconnect cp;

134
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
135 136 137

	conn->state = BT_DISCONN;

138
	cp.handle = cpu_to_le16(conn->handle);
L
Linus Torvalds 已提交
139
	cp.reason = reason;
140
	hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
L
Linus Torvalds 已提交
141 142
}

143 144 145 146 147 148 149 150 151 152 153 154 155 156
static void hci_amp_disconn(struct hci_conn *conn, __u8 reason)
{
	struct hci_cp_disconn_phy_link cp;

	BT_DBG("hcon %p", conn);

	conn->state = BT_DISCONN;

	cp.phy_handle = HCI_PHY_HANDLE(conn->handle);
	cp.reason = reason;
	hci_send_cmd(conn->hdev, HCI_OP_DISCONN_PHY_LINK,
		     sizeof(cp), &cp);
}

157
static void hci_add_sco(struct hci_conn *conn, __u16 handle)
L
Linus Torvalds 已提交
158 159 160 161
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_add_sco cp;

162
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
163 164

	conn->state = BT_CONNECT;
165
	conn->out = true;
L
Linus Torvalds 已提交
166

167 168
	conn->attempt++;

169
	cp.handle   = cpu_to_le16(handle);
170
	cp.pkt_type = cpu_to_le16(conn->pkt_type);
L
Linus Torvalds 已提交
171

172
	hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
L
Linus Torvalds 已提交
173 174
}

175 176 177 178 179
void hci_setup_sync(struct hci_conn *conn, __u16 handle)
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_setup_sync_conn cp;

180
	BT_DBG("hcon %p", conn);
181 182

	conn->state = BT_CONNECT;
183
	conn->out = true;
184

185 186
	conn->attempt++;

187 188
	cp.handle   = cpu_to_le16(handle);

189 190
	cp.tx_bandwidth   = __constant_cpu_to_le32(0x00001f40);
	cp.rx_bandwidth   = __constant_cpu_to_le32(0x00001f40);
191 192 193 194 195 196 197 198 199 200 201 202 203 204 205
	cp.voice_setting  = cpu_to_le16(conn->setting);

	switch (conn->setting & SCO_AIRMODE_MASK) {
	case SCO_AIRMODE_TRANSP:
		cp.pkt_type = __constant_cpu_to_le16(EDR_ESCO_MASK &
						     ~ESCO_2EV3);
		cp.max_latency = __constant_cpu_to_le16(0x000d);
		cp.retrans_effort = 0x02;
		break;
	case SCO_AIRMODE_CVSD:
		cp.pkt_type = cpu_to_le16(conn->pkt_type);
		cp.max_latency = __constant_cpu_to_le16(0xffff);
		cp.retrans_effort = 0xff;
		break;
	}
206 207 208 209

	hci_send_cmd(hdev, HCI_OP_SETUP_SYNC_CONN, sizeof(cp), &cp);
}

210
void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
211
			u16 latency, u16 to_multiplier)
212 213 214 215 216 217 218 219 220 221 222
{
	struct hci_cp_le_conn_update cp;
	struct hci_dev *hdev = conn->hdev;

	memset(&cp, 0, sizeof(cp));

	cp.handle		= cpu_to_le16(conn->handle);
	cp.conn_interval_min	= cpu_to_le16(min);
	cp.conn_interval_max	= cpu_to_le16(max);
	cp.conn_latency		= cpu_to_le16(latency);
	cp.supervision_timeout	= cpu_to_le16(to_multiplier);
223 224
	cp.min_ce_len		= __constant_cpu_to_le16(0x0001);
	cp.max_ce_len		= __constant_cpu_to_le16(0x0001);
225 226 227 228

	hci_send_cmd(hdev, HCI_OP_LE_CONN_UPDATE, sizeof(cp), &cp);
}

229
void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
230
		      __u8 ltk[16])
231 232 233 234
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_le_start_enc cp;

235
	BT_DBG("hcon %p", conn);
236 237 238 239 240 241

	memset(&cp, 0, sizeof(cp));

	cp.handle = cpu_to_le16(conn->handle);
	memcpy(cp.ltk, ltk, sizeof(cp.ltk));
	cp.ediv = ediv;
242
	memcpy(cp.rand, rand, sizeof(cp.rand));
243 244 245 246

	hci_send_cmd(hdev, HCI_OP_LE_START_ENC, sizeof(cp), &cp);
}

247 248 249 250 251 252 253 254
/* Device _must_ be locked */
void hci_sco_setup(struct hci_conn *conn, __u8 status)
{
	struct hci_conn *sco = conn->link;

	if (!sco)
		return;

255 256
	BT_DBG("hcon %p", conn);

257 258 259 260 261 262 263 264 265 266 267
	if (!status) {
		if (lmp_esco_capable(conn->hdev))
			hci_setup_sync(sco, conn->handle);
		else
			hci_add_sco(sco, conn->handle);
	} else {
		hci_proto_connect_cfm(sco, status);
		hci_conn_del(sco);
	}
}

268 269 270 271 272 273 274 275
static void hci_conn_disconnect(struct hci_conn *conn)
{
	__u8 reason = hci_proto_disconn_ind(conn);

	switch (conn->type) {
	case AMP_LINK:
		hci_amp_disconn(conn, reason);
		break;
276
	default:
A
Andre Guedes 已提交
277
		hci_disconnect(conn, reason);
278
		break;
279 280 281
	}
}

282
static void hci_conn_timeout(struct work_struct *work)
L
Linus Torvalds 已提交
283
{
284
	struct hci_conn *conn = container_of(work, struct hci_conn,
285
					     disc_work.work);
L
Linus Torvalds 已提交
286

287
	BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
L
Linus Torvalds 已提交
288 289 290 291

	if (atomic_read(&conn->refcnt))
		return;

292 293
	switch (conn->state) {
	case BT_CONNECT:
294
	case BT_CONNECT2:
V
Ville Tervo 已提交
295 296
		if (conn->out) {
			if (conn->type == ACL_LINK)
297
				hci_acl_create_connection_cancel(conn);
V
Ville Tervo 已提交
298
			else if (conn->type == LE_LINK)
299
				hci_le_create_connection_cancel(conn);
300 301
		} else if (conn->type == SCO_LINK || conn->type == ESCO_LINK) {
			hci_reject_sco(conn);
V
Ville Tervo 已提交
302
		}
303
		break;
304
	case BT_CONFIG:
305
	case BT_CONNECTED:
306
		hci_conn_disconnect(conn);
307 308
		break;
	default:
L
Linus Torvalds 已提交
309
		conn->state = BT_CLOSED;
310 311
		break;
	}
L
Linus Torvalds 已提交
312 313
}

314 315 316 317 318
/* Enter sniff mode */
static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
{
	struct hci_dev *hdev = conn->hdev;

319
	BT_DBG("hcon %p mode %d", conn, conn->mode);
320 321 322 323 324 325 326 327 328 329 330 331 332

	if (test_bit(HCI_RAW, &hdev->flags))
		return;

	if (!lmp_sniff_capable(hdev) || !lmp_sniff_capable(conn))
		return;

	if (conn->mode != HCI_CM_ACTIVE || !(conn->link_policy & HCI_LP_SNIFF))
		return;

	if (lmp_sniffsubr_capable(hdev) && lmp_sniffsubr_capable(conn)) {
		struct hci_cp_sniff_subrate cp;
		cp.handle             = cpu_to_le16(conn->handle);
333 334 335
		cp.max_latency        = __constant_cpu_to_le16(0);
		cp.min_remote_timeout = __constant_cpu_to_le16(0);
		cp.min_local_timeout  = __constant_cpu_to_le16(0);
336 337 338
		hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
	}

339
	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
340 341 342 343
		struct hci_cp_sniff_mode cp;
		cp.handle       = cpu_to_le16(conn->handle);
		cp.max_interval = cpu_to_le16(hdev->sniff_max_interval);
		cp.min_interval = cpu_to_le16(hdev->sniff_min_interval);
344 345
		cp.attempt      = __constant_cpu_to_le16(4);
		cp.timeout      = __constant_cpu_to_le16(1);
346 347 348 349
		hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
	}
}

350
static void hci_conn_idle(unsigned long arg)
L
Linus Torvalds 已提交
351
{
352 353
	struct hci_conn *conn = (void *) arg;

354
	BT_DBG("hcon %p mode %d", conn, conn->mode);
355 356

	hci_conn_enter_sniff_mode(conn);
L
Linus Torvalds 已提交
357 358
}

359 360 361 362 363 364
static void hci_conn_auto_accept(unsigned long arg)
{
	struct hci_conn *conn = (void *) arg;
	struct hci_dev *hdev = conn->hdev;

	hci_send_cmd(hdev, HCI_OP_USER_CONFIRM_REPLY, sizeof(conn->dst),
365
		     &conn->dst);
366 367
}

L
Linus Torvalds 已提交
368 369 370 371
struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
{
	struct hci_conn *conn;

372
	BT_DBG("%s dst %pMR", hdev->name, dst);
L
Linus Torvalds 已提交
373

374
	conn = kzalloc(sizeof(struct hci_conn), GFP_KERNEL);
375
	if (!conn)
L
Linus Torvalds 已提交
376 377 378
		return NULL;

	bacpy(&conn->dst, dst);
379 380 381 382
	conn->hdev  = hdev;
	conn->type  = type;
	conn->mode  = HCI_CM_ACTIVE;
	conn->state = BT_OPEN;
383
	conn->auth_type = HCI_AT_GENERAL_BONDING;
384
	conn->io_capability = hdev->io_capability;
385
	conn->remote_auth = 0xff;
386
	conn->key_type = 0xff;
L
Linus Torvalds 已提交
387

388
	set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
389
	conn->disc_timeout = HCI_DISCONN_TIMEOUT;
390

391 392 393 394 395 396
	switch (type) {
	case ACL_LINK:
		conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
		break;
	case SCO_LINK:
		if (lmp_esco_capable(hdev))
397 398
			conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
					(hdev->esco_type & EDR_ESCO_MASK);
399 400 401 402
		else
			conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
		break;
	case ESCO_LINK:
403
		conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
404 405 406
		break;
	}

L
Linus Torvalds 已提交
407
	skb_queue_head_init(&conn->data_q);
408

409
	INIT_LIST_HEAD(&conn->chan_list);
410

411
	INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout);
412
	setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
413
	setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept,
414
		    (unsigned long) conn);
L
Linus Torvalds 已提交
415 416 417 418 419 420

	atomic_set(&conn->refcnt, 0);

	hci_dev_hold(hdev);

	hci_conn_hash_add(hdev, conn);
421
	if (hdev->notify)
L
Linus Torvalds 已提交
422 423
		hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);

424 425
	hci_conn_init_sysfs(conn);

L
Linus Torvalds 已提交
426 427 428 429 430 431 432
	return conn;
}

int hci_conn_del(struct hci_conn *conn)
{
	struct hci_dev *hdev = conn->hdev;

433
	BT_DBG("%s hcon %p handle %d", hdev->name, conn, conn->handle);
L
Linus Torvalds 已提交
434

435 436
	del_timer(&conn->idle_timer);

437
	cancel_delayed_work_sync(&conn->disc_work);
L
Linus Torvalds 已提交
438

439 440
	del_timer(&conn->auto_accept_timer);

441
	if (conn->type == ACL_LINK) {
L
Linus Torvalds 已提交
442 443 444 445 446 447
		struct hci_conn *sco = conn->link;
		if (sco)
			sco->link = NULL;

		/* Unacked frames */
		hdev->acl_cnt += conn->sent;
448 449 450 451 452
	} else if (conn->type == LE_LINK) {
		if (hdev->le_pkts)
			hdev->le_cnt += conn->sent;
		else
			hdev->acl_cnt += conn->sent;
453 454 455 456
	} else {
		struct hci_conn *acl = conn->link;
		if (acl) {
			acl->link = NULL;
457
			hci_conn_drop(acl);
458
		}
L
Linus Torvalds 已提交
459 460
	}

461
	hci_chan_list_flush(conn);
462

463 464 465
	if (conn->amp_mgr)
		amp_mgr_put(conn->amp_mgr);

L
Linus Torvalds 已提交
466
	hci_conn_hash_del(hdev, conn);
467
	if (hdev->notify)
L
Linus Torvalds 已提交
468
		hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
469

L
Linus Torvalds 已提交
470 471
	skb_queue_purge(&conn->data_q);

472
	hci_conn_del_sysfs(conn);
473

474 475
	hci_dev_put(hdev);

476
	hci_conn_put(conn);
477

L
Linus Torvalds 已提交
478 479 480 481 482 483
	return 0;
}

struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src)
{
	int use_src = bacmp(src, BDADDR_ANY);
484
	struct hci_dev *hdev = NULL, *d;
L
Linus Torvalds 已提交
485

486
	BT_DBG("%pMR -> %pMR", src, dst);
L
Linus Torvalds 已提交
487

488
	read_lock(&hci_dev_list_lock);
L
Linus Torvalds 已提交
489

490
	list_for_each_entry(d, &hci_dev_list, list) {
491
		if (!test_bit(HCI_UP, &d->flags) ||
492 493
		    test_bit(HCI_RAW, &d->flags) ||
		    d->dev_type != HCI_BREDR)
L
Linus Torvalds 已提交
494 495
			continue;

496
		/* Simple routing:
L
Linus Torvalds 已提交
497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514
		 *   No source address - find interface with bdaddr != dst
		 *   Source address    - find interface with bdaddr == src
		 */

		if (use_src) {
			if (!bacmp(&d->bdaddr, src)) {
				hdev = d; break;
			}
		} else {
			if (bacmp(&d->bdaddr, dst)) {
				hdev = d; break;
			}
		}
	}

	if (hdev)
		hdev = hci_dev_hold(hdev);

515
	read_unlock(&hci_dev_list_lock);
L
Linus Torvalds 已提交
516 517 518 519
	return hdev;
}
EXPORT_SYMBOL(hci_get_route);

520 521
static struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
				    u8 dst_type, u8 sec_level, u8 auth_type)
L
Linus Torvalds 已提交
522
{
V
Ville Tervo 已提交
523
	struct hci_conn *le;
L
Linus Torvalds 已提交
524

525 526 527
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->flags))
		return ERR_PTR(-ENOTSUPP);

528 529 530 531 532
	le = hci_conn_hash_lookup_ba(hdev, LE_LINK, dst);
	if (!le) {
		le = hci_conn_hash_lookup_state(hdev, LE_LINK, BT_CONNECT);
		if (le)
			return ERR_PTR(-EBUSY);
L
Linus Torvalds 已提交
533

534 535 536
		le = hci_conn_add(hdev, LE_LINK, dst);
		if (!le)
			return ERR_PTR(-ENOMEM);
537

538 539 540
		le->dst_type = bdaddr_to_le(dst_type);
		hci_le_create_connection(le);
	}
541

542 543
	le->pending_sec_level = sec_level;
	le->auth_type = auth_type;
544

545
	hci_conn_hold(le);
V
Ville Tervo 已提交
546

547 548
	return le;
}
V
Ville Tervo 已提交
549

550 551
static struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
						u8 sec_level, u8 auth_type)
L
Linus Torvalds 已提交
552 553
{
	struct hci_conn *acl;
V
Ville Tervo 已提交
554

A
Andrei Emeltchenko 已提交
555 556 557 558
	acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
	if (!acl) {
		acl = hci_conn_add(hdev, ACL_LINK, dst);
		if (!acl)
559
			return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
560 561 562 563
	}

	hci_conn_hold(acl);

564
	if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
565 566
		acl->sec_level = BT_SECURITY_LOW;
		acl->pending_sec_level = sec_level;
567
		acl->auth_type = auth_type;
568
		hci_acl_create_connection(acl);
569
	}
L
Linus Torvalds 已提交
570

571 572 573
	return acl;
}

574 575
struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type, bdaddr_t *dst,
				 __u16 setting)
576 577 578 579
{
	struct hci_conn *acl;
	struct hci_conn *sco;

580
	acl = hci_connect_acl(hdev, dst, BT_SECURITY_LOW, HCI_AT_NO_BONDING);
581
	if (IS_ERR(acl))
582
		return acl;
L
Linus Torvalds 已提交
583

A
Andrei Emeltchenko 已提交
584 585 586 587
	sco = hci_conn_hash_lookup_ba(hdev, type, dst);
	if (!sco) {
		sco = hci_conn_add(hdev, type, dst);
		if (!sco) {
588
			hci_conn_drop(acl);
589
			return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
590
		}
591
	}
L
Linus Torvalds 已提交
592

593 594
	acl->link = sco;
	sco->link = acl;
L
Linus Torvalds 已提交
595

596
	hci_conn_hold(sco);
L
Linus Torvalds 已提交
597

598 599
	sco->setting = setting;

600
	if (acl->state == BT_CONNECTED &&
601
	    (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
602
		set_bit(HCI_CONN_POWER_SAVE, &acl->flags);
603
		hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON);
604

605
		if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) {
606
			/* defer SCO setup until mode change completed */
607
			set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags);
608 609 610 611
			return sco;
		}

		hci_sco_setup(acl, 0x00);
612
	}
613 614

	return sco;
L
Linus Torvalds 已提交
615 616
}

617 618 619 620
/* Create SCO, ACL or LE connection. */
struct hci_conn *hci_connect(struct hci_dev *hdev, int type, bdaddr_t *dst,
			     __u8 dst_type, __u8 sec_level, __u8 auth_type)
{
621
	BT_DBG("%s dst %pMR type 0x%x", hdev->name, dst, type);
622

623 624
	switch (type) {
	case LE_LINK:
625
		return hci_connect_le(hdev, dst, dst_type, sec_level, auth_type);
626
	case ACL_LINK:
627
		return hci_connect_acl(hdev, dst, sec_level, auth_type);
628
	}
629

630
	return ERR_PTR(-EINVAL);
631 632
}

633 634 635
/* Check link security requirement */
int hci_conn_check_link_mode(struct hci_conn *conn)
{
636
	BT_DBG("hcon %p", conn);
637

638
	if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
639 640 641 642 643
		return 0;

	return 1;
}

L
Linus Torvalds 已提交
644
/* Authenticate remote device */
645
static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
L
Linus Torvalds 已提交
646
{
647
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
648

649 650 651
	if (conn->pending_sec_level > sec_level)
		sec_level = conn->pending_sec_level;

652
	if (sec_level > conn->sec_level)
653
		conn->pending_sec_level = sec_level;
654
	else if (conn->link_mode & HCI_LM_AUTH)
L
Linus Torvalds 已提交
655 656
		return 1;

657 658 659
	/* Make sure we preserve an existing MITM requirement*/
	auth_type |= (conn->auth_type & 0x01);

660 661
	conn->auth_type = auth_type;

662
	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
663
		struct hci_cp_auth_requested cp;
664 665 666 667

		/* encrypt must be pending if auth is also pending */
		set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags);

668
		cp.handle = cpu_to_le16(conn->handle);
669
		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
670
			     sizeof(cp), &cp);
671
		if (conn->key_type != 0xff)
672
			set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
L
Linus Torvalds 已提交
673
	}
674

L
Linus Torvalds 已提交
675 676 677
	return 0;
}

678 679 680
/* Encrypt the the link */
static void hci_conn_encrypt(struct hci_conn *conn)
{
681
	BT_DBG("hcon %p", conn);
682

683
	if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
684 685 686 687
		struct hci_cp_set_conn_encrypt cp;
		cp.handle  = cpu_to_le16(conn->handle);
		cp.encrypt = 0x01;
		hci_send_cmd(conn->hdev, HCI_OP_SET_CONN_ENCRYPT, sizeof(cp),
688
			     &cp);
689 690 691
	}
}

692
/* Enable security */
693
int hci_conn_security(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
L
Linus Torvalds 已提交
694
{
695
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
696

697 698 699
	if (conn->type == LE_LINK)
		return smp_conn_security(conn, sec_level);

700
	/* For sdp we don't need the link key. */
701 702 703
	if (sec_level == BT_SECURITY_SDP)
		return 1;

704 705
	/* For non 2.1 devices and low security level we don't need the link
	   key. */
706
	if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
707
		return 1;
708

709 710 711 712 713 714 715 716 717 718 719 720
	/* For other security levels we need the link key. */
	if (!(conn->link_mode & HCI_LM_AUTH))
		goto auth;

	/* An authenticated combination key has sufficient security for any
	   security level. */
	if (conn->key_type == HCI_LK_AUTH_COMBINATION)
		goto encrypt;

	/* An unauthenticated combination key has sufficient security for
	   security level 1 and 2. */
	if (conn->key_type == HCI_LK_UNAUTH_COMBINATION &&
721
	    (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW))
722 723 724 725 726 727 728
		goto encrypt;

	/* A combination key has always sufficient security for the security
	   levels 1 or 2. High security level requires the combination key
	   is generated using maximum PIN code length (16).
	   For pre 2.1 units. */
	if (conn->key_type == HCI_LK_COMBINATION &&
729
	    (sec_level != BT_SECURITY_HIGH || conn->pin_length == 16))
730 731 732
		goto encrypt;

auth:
733
	if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
L
Linus Torvalds 已提交
734 735
		return 0;

736 737
	if (!hci_conn_auth(conn, sec_level, auth_type))
		return 0;
738 739 740 741

encrypt:
	if (conn->link_mode & HCI_LM_ENCRYPT)
		return 1;
742

743
	hci_conn_encrypt(conn);
L
Linus Torvalds 已提交
744 745
	return 0;
}
746
EXPORT_SYMBOL(hci_conn_security);
L
Linus Torvalds 已提交
747

748 749 750
/* Check secure link requirement */
int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level)
{
751
	BT_DBG("hcon %p", conn);
752 753 754 755

	if (sec_level != BT_SECURITY_HIGH)
		return 1; /* Accept if non-secure is required */

756
	if (conn->sec_level == BT_SECURITY_HIGH)
757 758 759 760 761 762
		return 1;

	return 0; /* Reject not secure link */
}
EXPORT_SYMBOL(hci_conn_check_secure);

L
Linus Torvalds 已提交
763 764 765
/* Change link key */
int hci_conn_change_link_key(struct hci_conn *conn)
{
766
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
767

768
	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
769
		struct hci_cp_change_conn_link_key cp;
770
		cp.handle = cpu_to_le16(conn->handle);
771
		hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
772
			     sizeof(cp), &cp);
L
Linus Torvalds 已提交
773
	}
774

L
Linus Torvalds 已提交
775 776 777 778
	return 0;
}

/* Switch role */
779
int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
L
Linus Torvalds 已提交
780
{
781
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
782 783 784 785

	if (!role && conn->link_mode & HCI_LM_MASTER)
		return 1;

786
	if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
787 788 789
		struct hci_cp_switch_role cp;
		bacpy(&cp.bdaddr, &conn->dst);
		cp.role = role;
790
		hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
L
Linus Torvalds 已提交
791
	}
792

L
Linus Torvalds 已提交
793 794 795 796
	return 0;
}
EXPORT_SYMBOL(hci_conn_switch_role);

797
/* Enter active mode */
798
void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
799 800 801
{
	struct hci_dev *hdev = conn->hdev;

802
	BT_DBG("hcon %p mode %d", conn, conn->mode);
803 804 805 806

	if (test_bit(HCI_RAW, &hdev->flags))
		return;

807 808 809
	if (conn->mode != HCI_CM_SNIFF)
		goto timer;

810
	if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active)
811 812
		goto timer;

813
	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
814
		struct hci_cp_exit_sniff_mode cp;
815
		cp.handle = cpu_to_le16(conn->handle);
816
		hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
817 818 819 820 821
	}

timer:
	if (hdev->idle_timeout > 0)
		mod_timer(&conn->idle_timer,
822
			  jiffies + msecs_to_jiffies(hdev->idle_timeout));
823 824
}

L
Linus Torvalds 已提交
825 826 827 828
/* Drop all connection on the device */
void hci_conn_hash_flush(struct hci_dev *hdev)
{
	struct hci_conn_hash *h = &hdev->conn_hash;
829
	struct hci_conn *c, *n;
L
Linus Torvalds 已提交
830 831 832

	BT_DBG("hdev %s", hdev->name);

833
	list_for_each_entry_safe(c, n, &h->list, list) {
L
Linus Torvalds 已提交
834 835
		c->state = BT_CLOSED;

836
		hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
L
Linus Torvalds 已提交
837 838 839 840
		hci_conn_del(c);
	}
}

841 842 843 844 845 846 847 848 849 850 851
/* Check pending connect attempts */
void hci_conn_check_pending(struct hci_dev *hdev)
{
	struct hci_conn *conn;

	BT_DBG("hdev %s", hdev->name);

	hci_dev_lock(hdev);

	conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
	if (conn)
852
		hci_acl_create_connection(conn);
853 854 855 856

	hci_dev_unlock(hdev);
}

L
Linus Torvalds 已提交
857 858
int hci_get_conn_list(void __user *arg)
{
859
	struct hci_conn *c;
L
Linus Torvalds 已提交
860 861 862 863 864 865 866 867 868 869 870 871 872
	struct hci_conn_list_req req, *cl;
	struct hci_conn_info *ci;
	struct hci_dev *hdev;
	int n = 0, size, err;

	if (copy_from_user(&req, arg, sizeof(req)))
		return -EFAULT;

	if (!req.conn_num || req.conn_num > (PAGE_SIZE * 2) / sizeof(*ci))
		return -EINVAL;

	size = sizeof(req) + req.conn_num * sizeof(*ci);

A
Andrei Emeltchenko 已提交
873 874
	cl = kmalloc(size, GFP_KERNEL);
	if (!cl)
L
Linus Torvalds 已提交
875 876
		return -ENOMEM;

A
Andrei Emeltchenko 已提交
877 878
	hdev = hci_dev_get(req.dev_id);
	if (!hdev) {
L
Linus Torvalds 已提交
879 880 881 882 883 884
		kfree(cl);
		return -ENODEV;
	}

	ci = cl->conn_info;

885
	hci_dev_lock(hdev);
886
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
L
Linus Torvalds 已提交
887 888 889 890 891 892 893 894 895
		bacpy(&(ci + n)->bdaddr, &c->dst);
		(ci + n)->handle = c->handle;
		(ci + n)->type  = c->type;
		(ci + n)->out   = c->out;
		(ci + n)->state = c->state;
		(ci + n)->link_mode = c->link_mode;
		if (++n >= req.conn_num)
			break;
	}
896
	hci_dev_unlock(hdev);
L
Linus Torvalds 已提交
897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919

	cl->dev_id = hdev->id;
	cl->conn_num = n;
	size = sizeof(req) + n * sizeof(*ci);

	hci_dev_put(hdev);

	err = copy_to_user(arg, cl, size);
	kfree(cl);

	return err ? -EFAULT : 0;
}

int hci_get_conn_info(struct hci_dev *hdev, void __user *arg)
{
	struct hci_conn_info_req req;
	struct hci_conn_info ci;
	struct hci_conn *conn;
	char __user *ptr = arg + sizeof(req);

	if (copy_from_user(&req, arg, sizeof(req)))
		return -EFAULT;

920
	hci_dev_lock(hdev);
L
Linus Torvalds 已提交
921 922 923 924 925 926 927 928 929
	conn = hci_conn_hash_lookup_ba(hdev, req.type, &req.bdaddr);
	if (conn) {
		bacpy(&ci.bdaddr, &conn->dst);
		ci.handle = conn->handle;
		ci.type  = conn->type;
		ci.out   = conn->out;
		ci.state = conn->state;
		ci.link_mode = conn->link_mode;
	}
930
	hci_dev_unlock(hdev);
L
Linus Torvalds 已提交
931 932 933 934 935 936

	if (!conn)
		return -ENOENT;

	return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
}
937 938 939 940 941 942 943 944 945

int hci_get_auth_info(struct hci_dev *hdev, void __user *arg)
{
	struct hci_auth_info_req req;
	struct hci_conn *conn;

	if (copy_from_user(&req, arg, sizeof(req)))
		return -EFAULT;

946
	hci_dev_lock(hdev);
947 948 949
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
	if (conn)
		req.type = conn->auth_type;
950
	hci_dev_unlock(hdev);
951 952 953 954 955 956

	if (!conn)
		return -ENOENT;

	return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
}
957 958 959 960 961 962

struct hci_chan *hci_chan_create(struct hci_conn *conn)
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_chan *chan;

963
	BT_DBG("%s hcon %p", hdev->name, conn);
964

965
	chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
966 967 968 969 970
	if (!chan)
		return NULL;

	chan->conn = conn;
	skb_queue_head_init(&chan->data_q);
M
Mat Martineau 已提交
971
	chan->state = BT_CONNECTED;
972

973
	list_add_rcu(&chan->list, &conn->chan_list);
974 975 976 977

	return chan;
}

978
void hci_chan_del(struct hci_chan *chan)
979 980 981 982
{
	struct hci_conn *conn = chan->conn;
	struct hci_dev *hdev = conn->hdev;

983
	BT_DBG("%s hcon %p chan %p", hdev->name, conn, chan);
984

985 986 987
	list_del_rcu(&chan->list);

	synchronize_rcu();
988

989
	hci_conn_drop(conn);
990

991 992 993 994
	skb_queue_purge(&chan->data_q);
	kfree(chan);
}

995
void hci_chan_list_flush(struct hci_conn *conn)
996
{
997
	struct hci_chan *chan, *n;
998

999
	BT_DBG("hcon %p", conn);
1000

1001
	list_for_each_entry_safe(chan, n, &conn->chan_list, list)
1002 1003
		hci_chan_del(chan);
}
1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035

static struct hci_chan *__hci_chan_lookup_handle(struct hci_conn *hcon,
						 __u16 handle)
{
	struct hci_chan *hchan;

	list_for_each_entry(hchan, &hcon->chan_list, list) {
		if (hchan->handle == handle)
			return hchan;
	}

	return NULL;
}

struct hci_chan *hci_chan_lookup_handle(struct hci_dev *hdev, __u16 handle)
{
	struct hci_conn_hash *h = &hdev->conn_hash;
	struct hci_conn *hcon;
	struct hci_chan *hchan = NULL;

	rcu_read_lock();

	list_for_each_entry_rcu(hcon, &h->list, list) {
		hchan = __hci_chan_lookup_handle(hcon, handle);
		if (hchan)
			break;
	}

	rcu_read_unlock();

	return hchan;
}