hci_conn.c 22.6 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
}

L
Linus Torvalds 已提交
120 121 122 123
void hci_acl_disconn(struct hci_conn *conn, __u8 reason)
{
	struct hci_cp_disconnect cp;

124
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
125 126 127

	conn->state = BT_DISCONN;

128
	cp.handle = cpu_to_le16(conn->handle);
L
Linus Torvalds 已提交
129
	cp.reason = reason;
130
	hci_send_cmd(conn->hdev, HCI_OP_DISCONNECT, sizeof(cp), &cp);
L
Linus Torvalds 已提交
131 132
}

133
static void hci_add_sco(struct hci_conn *conn, __u16 handle)
L
Linus Torvalds 已提交
134 135 136 137
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_add_sco cp;

138
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
139 140

	conn->state = BT_CONNECT;
141
	conn->out = true;
L
Linus Torvalds 已提交
142

143 144
	conn->attempt++;

145
	cp.handle   = cpu_to_le16(handle);
146
	cp.pkt_type = cpu_to_le16(conn->pkt_type);
L
Linus Torvalds 已提交
147

148
	hci_send_cmd(hdev, HCI_OP_ADD_SCO, sizeof(cp), &cp);
L
Linus Torvalds 已提交
149 150
}

151 152 153 154 155
void hci_setup_sync(struct hci_conn *conn, __u16 handle)
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_setup_sync_conn cp;

156
	BT_DBG("hcon %p", conn);
157 158

	conn->state = BT_CONNECT;
159
	conn->out = true;
160

161 162
	conn->attempt++;

163
	cp.handle   = cpu_to_le16(handle);
164
	cp.pkt_type = cpu_to_le16(conn->pkt_type);
165

166 167 168
	cp.tx_bandwidth   = __constant_cpu_to_le32(0x00001f40);
	cp.rx_bandwidth   = __constant_cpu_to_le32(0x00001f40);
	cp.max_latency    = __constant_cpu_to_le16(0xffff);
169 170 171 172 173 174
	cp.voice_setting  = cpu_to_le16(hdev->voice_setting);
	cp.retrans_effort = 0xff;

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

175
void hci_le_conn_update(struct hci_conn *conn, u16 min, u16 max,
176
			u16 latency, u16 to_multiplier)
177 178 179 180 181 182 183 184 185 186 187
{
	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);
188 189
	cp.min_ce_len		= __constant_cpu_to_le16(0x0001);
	cp.max_ce_len		= __constant_cpu_to_le16(0x0001);
190 191 192 193

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

194
void hci_le_start_enc(struct hci_conn *conn, __le16 ediv, __u8 rand[8],
195
		      __u8 ltk[16])
196 197 198 199
{
	struct hci_dev *hdev = conn->hdev;
	struct hci_cp_le_start_enc cp;

200
	BT_DBG("hcon %p", conn);
201 202 203 204 205 206

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

	cp.handle = cpu_to_le16(conn->handle);
	memcpy(cp.ltk, ltk, sizeof(cp.ltk));
	cp.ediv = ediv;
207
	memcpy(cp.rand, rand, sizeof(cp.rand));
208 209 210 211

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

212 213 214 215 216 217 218 219
/* Device _must_ be locked */
void hci_sco_setup(struct hci_conn *conn, __u8 status)
{
	struct hci_conn *sco = conn->link;

	if (!sco)
		return;

220 221
	BT_DBG("hcon %p", conn);

222 223 224 225 226 227 228 229 230 231 232
	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);
	}
}

233
static void hci_conn_timeout(struct work_struct *work)
L
Linus Torvalds 已提交
234
{
235
	struct hci_conn *conn = container_of(work, struct hci_conn,
236
					     disc_work.work);
237
	__u8 reason;
L
Linus Torvalds 已提交
238

239
	BT_DBG("hcon %p state %s", conn, state_to_string(conn->state));
L
Linus Torvalds 已提交
240 241 242 243

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

244 245
	switch (conn->state) {
	case BT_CONNECT:
246
	case BT_CONNECT2:
V
Ville Tervo 已提交
247 248
		if (conn->out) {
			if (conn->type == ACL_LINK)
249
				hci_acl_create_connection_cancel(conn);
V
Ville Tervo 已提交
250
			else if (conn->type == LE_LINK)
251
				hci_le_create_connection_cancel(conn);
V
Ville Tervo 已提交
252
		}
253
		break;
254
	case BT_CONFIG:
255
	case BT_CONNECTED:
256 257
		reason = hci_proto_disconn_ind(conn);
		hci_acl_disconn(conn, reason);
258 259
		break;
	default:
L
Linus Torvalds 已提交
260
		conn->state = BT_CLOSED;
261 262
		break;
	}
L
Linus Torvalds 已提交
263 264
}

265 266 267 268 269
/* Enter sniff mode */
static void hci_conn_enter_sniff_mode(struct hci_conn *conn)
{
	struct hci_dev *hdev = conn->hdev;

270
	BT_DBG("hcon %p mode %d", conn, conn->mode);
271 272 273 274 275 276 277 278 279 280 281 282 283

	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);
284 285 286
		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);
287 288 289
		hci_send_cmd(hdev, HCI_OP_SNIFF_SUBRATE, sizeof(cp), &cp);
	}

290
	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
291 292 293 294
		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);
295 296
		cp.attempt      = __constant_cpu_to_le16(4);
		cp.timeout      = __constant_cpu_to_le16(1);
297 298 299 300
		hci_send_cmd(hdev, HCI_OP_SNIFF_MODE, sizeof(cp), &cp);
	}
}

301
static void hci_conn_idle(unsigned long arg)
L
Linus Torvalds 已提交
302
{
303 304
	struct hci_conn *conn = (void *) arg;

305
	BT_DBG("hcon %p mode %d", conn, conn->mode);
306 307

	hci_conn_enter_sniff_mode(conn);
L
Linus Torvalds 已提交
308 309
}

310 311 312 313 314 315
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),
316
		     &conn->dst);
317 318
}

L
Linus Torvalds 已提交
319 320 321 322 323 324
struct hci_conn *hci_conn_add(struct hci_dev *hdev, int type, bdaddr_t *dst)
{
	struct hci_conn *conn;

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

325
	conn = kzalloc(sizeof(struct hci_conn), GFP_KERNEL);
326
	if (!conn)
L
Linus Torvalds 已提交
327 328 329
		return NULL;

	bacpy(&conn->dst, dst);
330 331 332 333
	conn->hdev  = hdev;
	conn->type  = type;
	conn->mode  = HCI_CM_ACTIVE;
	conn->state = BT_OPEN;
334
	conn->auth_type = HCI_AT_GENERAL_BONDING;
335
	conn->io_capability = hdev->io_capability;
336
	conn->remote_auth = 0xff;
337
	conn->key_type = 0xff;
L
Linus Torvalds 已提交
338

339
	set_bit(HCI_CONN_POWER_SAVE, &conn->flags);
340
	conn->disc_timeout = HCI_DISCONN_TIMEOUT;
341

342 343 344 345 346 347
	switch (type) {
	case ACL_LINK:
		conn->pkt_type = hdev->pkt_type & ACL_PTYPE_MASK;
		break;
	case SCO_LINK:
		if (lmp_esco_capable(hdev))
348 349
			conn->pkt_type = (hdev->esco_type & SCO_ESCO_MASK) |
					(hdev->esco_type & EDR_ESCO_MASK);
350 351 352 353
		else
			conn->pkt_type = hdev->pkt_type & SCO_PTYPE_MASK;
		break;
	case ESCO_LINK:
354
		conn->pkt_type = hdev->esco_type & ~EDR_ESCO_MASK;
355 356 357
		break;
	}

L
Linus Torvalds 已提交
358
	skb_queue_head_init(&conn->data_q);
359

360
	INIT_LIST_HEAD(&conn->chan_list);
361

362
	INIT_DELAYED_WORK(&conn->disc_work, hci_conn_timeout);
363
	setup_timer(&conn->idle_timer, hci_conn_idle, (unsigned long)conn);
364
	setup_timer(&conn->auto_accept_timer, hci_conn_auto_accept,
365
		    (unsigned long) conn);
L
Linus Torvalds 已提交
366 367 368 369 370 371

	atomic_set(&conn->refcnt, 0);

	hci_dev_hold(hdev);

	hci_conn_hash_add(hdev, conn);
372
	if (hdev->notify)
L
Linus Torvalds 已提交
373 374
		hdev->notify(hdev, HCI_NOTIFY_CONN_ADD);

375 376
	atomic_set(&conn->devref, 0);

377 378
	hci_conn_init_sysfs(conn);

L
Linus Torvalds 已提交
379 380 381 382 383 384 385
	return conn;
}

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

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

388 389
	del_timer(&conn->idle_timer);

390
	cancel_delayed_work_sync(&conn->disc_work);
L
Linus Torvalds 已提交
391

392 393
	del_timer(&conn->auto_accept_timer);

394
	if (conn->type == ACL_LINK) {
L
Linus Torvalds 已提交
395 396 397 398 399 400
		struct hci_conn *sco = conn->link;
		if (sco)
			sco->link = NULL;

		/* Unacked frames */
		hdev->acl_cnt += conn->sent;
401 402 403 404 405
	} else if (conn->type == LE_LINK) {
		if (hdev->le_pkts)
			hdev->le_cnt += conn->sent;
		else
			hdev->acl_cnt += conn->sent;
406 407 408 409 410 411
	} else {
		struct hci_conn *acl = conn->link;
		if (acl) {
			acl->link = NULL;
			hci_conn_put(acl);
		}
L
Linus Torvalds 已提交
412 413
	}

414
	hci_chan_list_flush(conn);
415

416 417 418
	if (conn->amp_mgr)
		amp_mgr_put(conn->amp_mgr);

L
Linus Torvalds 已提交
419
	hci_conn_hash_del(hdev, conn);
420
	if (hdev->notify)
L
Linus Torvalds 已提交
421
		hdev->notify(hdev, HCI_NOTIFY_CONN_DEL);
422

L
Linus Torvalds 已提交
423 424
	skb_queue_purge(&conn->data_q);

425
	hci_conn_put_device(conn);
426

427 428
	hci_dev_put(hdev);

429 430 431
	if (conn->handle == 0)
		kfree(conn);

L
Linus Torvalds 已提交
432 433 434 435 436 437
	return 0;
}

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

	BT_DBG("%s -> %s", batostr(src), batostr(dst));

442
	read_lock(&hci_dev_list_lock);
L
Linus Torvalds 已提交
443

444
	list_for_each_entry(d, &hci_dev_list, list) {
445
		if (!test_bit(HCI_UP, &d->flags) ||
446 447
		    test_bit(HCI_RAW, &d->flags) ||
		    d->dev_type != HCI_BREDR)
L
Linus Torvalds 已提交
448 449
			continue;

450
		/* Simple routing:
L
Linus Torvalds 已提交
451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468
		 *   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);

469
	read_unlock(&hci_dev_list_lock);
L
Linus Torvalds 已提交
470 471 472 473
	return hdev;
}
EXPORT_SYMBOL(hci_get_route);

474 475
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 已提交
476
{
V
Ville Tervo 已提交
477
	struct hci_conn *le;
L
Linus Torvalds 已提交
478

479 480 481 482 483
	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 已提交
484

485 486 487
		le = hci_conn_add(hdev, LE_LINK, dst);
		if (!le)
			return ERR_PTR(-ENOMEM);
488

489 490 491
		le->dst_type = bdaddr_to_le(dst_type);
		hci_le_create_connection(le);
	}
492

493 494
	le->pending_sec_level = sec_level;
	le->auth_type = auth_type;
495

496
	hci_conn_hold(le);
V
Ville Tervo 已提交
497

498 499
	return le;
}
V
Ville Tervo 已提交
500

501 502
static struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
						u8 sec_level, u8 auth_type)
L
Linus Torvalds 已提交
503 504
{
	struct hci_conn *acl;
V
Ville Tervo 已提交
505

A
Andrei Emeltchenko 已提交
506 507 508 509
	acl = hci_conn_hash_lookup_ba(hdev, ACL_LINK, dst);
	if (!acl) {
		acl = hci_conn_add(hdev, ACL_LINK, dst);
		if (!acl)
510
			return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
511 512 513 514
	}

	hci_conn_hold(acl);

515
	if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
516 517
		acl->sec_level = BT_SECURITY_LOW;
		acl->pending_sec_level = sec_level;
518
		acl->auth_type = auth_type;
519
		hci_acl_create_connection(acl);
520
	}
L
Linus Torvalds 已提交
521

522 523 524
	return acl;
}

525 526
static struct hci_conn *hci_connect_sco(struct hci_dev *hdev, int type,
				bdaddr_t *dst, u8 sec_level, u8 auth_type)
527 528 529 530 531 532
{
	struct hci_conn *acl;
	struct hci_conn *sco;

	acl = hci_connect_acl(hdev, dst, sec_level, auth_type);
	if (IS_ERR(acl))
533
		return acl;
L
Linus Torvalds 已提交
534

A
Andrei Emeltchenko 已提交
535 536 537 538
	sco = hci_conn_hash_lookup_ba(hdev, type, dst);
	if (!sco) {
		sco = hci_conn_add(hdev, type, dst);
		if (!sco) {
539
			hci_conn_put(acl);
540
			return ERR_PTR(-ENOMEM);
L
Linus Torvalds 已提交
541
		}
542
	}
L
Linus Torvalds 已提交
543

544 545
	acl->link = sco;
	sco->link = acl;
L
Linus Torvalds 已提交
546

547
	hci_conn_hold(sco);
L
Linus Torvalds 已提交
548

549
	if (acl->state == BT_CONNECTED &&
550
	    (sco->state == BT_OPEN || sco->state == BT_CLOSED)) {
551
		set_bit(HCI_CONN_POWER_SAVE, &acl->flags);
552
		hci_conn_enter_active_mode(acl, BT_POWER_FORCE_ACTIVE_ON);
553

554
		if (test_bit(HCI_CONN_MODE_CHANGE_PEND, &acl->flags)) {
555
			/* defer SCO setup until mode change completed */
556
			set_bit(HCI_CONN_SCO_SETUP_PEND, &acl->flags);
557 558 559 560
			return sco;
		}

		hci_sco_setup(acl, 0x00);
561
	}
562 563

	return sco;
L
Linus Torvalds 已提交
564 565
}

566 567 568 569
/* 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)
{
570
	BT_DBG("%s dst %s type 0x%x", hdev->name, batostr(dst), type);
571

572 573
	switch (type) {
	case LE_LINK:
574
		return hci_connect_le(hdev, dst, dst_type, sec_level, auth_type);
575
	case ACL_LINK:
576
		return hci_connect_acl(hdev, dst, sec_level, auth_type);
577
	case SCO_LINK:
578 579
	case ESCO_LINK:
		return hci_connect_sco(hdev, type, dst, sec_level, auth_type);
580
	}
581

582
	return ERR_PTR(-EINVAL);
583 584
}

585 586 587
/* Check link security requirement */
int hci_conn_check_link_mode(struct hci_conn *conn)
{
588
	BT_DBG("hcon %p", conn);
589

590
	if (hci_conn_ssp_enabled(conn) && !(conn->link_mode & HCI_LM_ENCRYPT))
591 592 593 594 595
		return 0;

	return 1;
}

L
Linus Torvalds 已提交
596
/* Authenticate remote device */
597
static int hci_conn_auth(struct hci_conn *conn, __u8 sec_level, __u8 auth_type)
L
Linus Torvalds 已提交
598
{
599
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
600

601 602 603
	if (conn->pending_sec_level > sec_level)
		sec_level = conn->pending_sec_level;

604
	if (sec_level > conn->sec_level)
605
		conn->pending_sec_level = sec_level;
606
	else if (conn->link_mode & HCI_LM_AUTH)
L
Linus Torvalds 已提交
607 608
		return 1;

609 610 611
	/* Make sure we preserve an existing MITM requirement*/
	auth_type |= (conn->auth_type & 0x01);

612 613
	conn->auth_type = auth_type;

614
	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
615
		struct hci_cp_auth_requested cp;
616 617 618 619

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

620
		cp.handle = cpu_to_le16(conn->handle);
621
		hci_send_cmd(conn->hdev, HCI_OP_AUTH_REQUESTED,
622
			     sizeof(cp), &cp);
623
		if (conn->key_type != 0xff)
624
			set_bit(HCI_CONN_REAUTH_PEND, &conn->flags);
L
Linus Torvalds 已提交
625
	}
626

L
Linus Torvalds 已提交
627 628 629
	return 0;
}

630 631 632
/* Encrypt the the link */
static void hci_conn_encrypt(struct hci_conn *conn)
{
633
	BT_DBG("hcon %p", conn);
634

635
	if (!test_and_set_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags)) {
636 637 638 639
		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),
640
			     &cp);
641 642 643
	}
}

644
/* Enable security */
645
int hci_conn_security(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->type == LE_LINK)
		return smp_conn_security(conn, sec_level);

652
	/* For sdp we don't need the link key. */
653 654 655
	if (sec_level == BT_SECURITY_SDP)
		return 1;

656 657
	/* For non 2.1 devices and low security level we don't need the link
	   key. */
658
	if (sec_level == BT_SECURITY_LOW && !hci_conn_ssp_enabled(conn))
659
		return 1;
660

661 662 663 664 665 666 667 668 669 670 671 672
	/* 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 &&
673
	    (sec_level == BT_SECURITY_MEDIUM || sec_level == BT_SECURITY_LOW))
674 675 676 677 678 679 680
		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 &&
681
	    (sec_level != BT_SECURITY_HIGH || conn->pin_length == 16))
682 683 684
		goto encrypt;

auth:
685
	if (test_bit(HCI_CONN_ENCRYPT_PEND, &conn->flags))
L
Linus Torvalds 已提交
686 687
		return 0;

688 689
	if (!hci_conn_auth(conn, sec_level, auth_type))
		return 0;
690 691 692 693

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

695
	hci_conn_encrypt(conn);
L
Linus Torvalds 已提交
696 697
	return 0;
}
698
EXPORT_SYMBOL(hci_conn_security);
L
Linus Torvalds 已提交
699

700 701 702
/* Check secure link requirement */
int hci_conn_check_secure(struct hci_conn *conn, __u8 sec_level)
{
703
	BT_DBG("hcon %p", conn);
704 705 706 707

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

708
	if (conn->sec_level == BT_SECURITY_HIGH)
709 710 711 712 713 714
		return 1;

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

L
Linus Torvalds 已提交
715 716 717
/* Change link key */
int hci_conn_change_link_key(struct hci_conn *conn)
{
718
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
719

720
	if (!test_and_set_bit(HCI_CONN_AUTH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
721
		struct hci_cp_change_conn_link_key cp;
722
		cp.handle = cpu_to_le16(conn->handle);
723
		hci_send_cmd(conn->hdev, HCI_OP_CHANGE_CONN_LINK_KEY,
724
			     sizeof(cp), &cp);
L
Linus Torvalds 已提交
725
	}
726

L
Linus Torvalds 已提交
727 728 729 730
	return 0;
}

/* Switch role */
731
int hci_conn_switch_role(struct hci_conn *conn, __u8 role)
L
Linus Torvalds 已提交
732
{
733
	BT_DBG("hcon %p", conn);
L
Linus Torvalds 已提交
734 735 736 737

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

738
	if (!test_and_set_bit(HCI_CONN_RSWITCH_PEND, &conn->flags)) {
L
Linus Torvalds 已提交
739 740 741
		struct hci_cp_switch_role cp;
		bacpy(&cp.bdaddr, &conn->dst);
		cp.role = role;
742
		hci_send_cmd(conn->hdev, HCI_OP_SWITCH_ROLE, sizeof(cp), &cp);
L
Linus Torvalds 已提交
743
	}
744

L
Linus Torvalds 已提交
745 746 747 748
	return 0;
}
EXPORT_SYMBOL(hci_conn_switch_role);

749
/* Enter active mode */
750
void hci_conn_enter_active_mode(struct hci_conn *conn, __u8 force_active)
751 752 753
{
	struct hci_dev *hdev = conn->hdev;

754
	BT_DBG("hcon %p mode %d", conn, conn->mode);
755 756 757 758

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

759 760 761
	if (conn->mode != HCI_CM_SNIFF)
		goto timer;

762
	if (!test_bit(HCI_CONN_POWER_SAVE, &conn->flags) && !force_active)
763 764
		goto timer;

765
	if (!test_and_set_bit(HCI_CONN_MODE_CHANGE_PEND, &conn->flags)) {
766
		struct hci_cp_exit_sniff_mode cp;
767
		cp.handle = cpu_to_le16(conn->handle);
768
		hci_send_cmd(hdev, HCI_OP_EXIT_SNIFF_MODE, sizeof(cp), &cp);
769 770 771 772 773
	}

timer:
	if (hdev->idle_timeout > 0)
		mod_timer(&conn->idle_timer,
774
			  jiffies + msecs_to_jiffies(hdev->idle_timeout));
775 776
}

L
Linus Torvalds 已提交
777 778 779 780
/* Drop all connection on the device */
void hci_conn_hash_flush(struct hci_dev *hdev)
{
	struct hci_conn_hash *h = &hdev->conn_hash;
781
	struct hci_conn *c, *n;
L
Linus Torvalds 已提交
782 783 784

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

785
	list_for_each_entry_safe(c, n, &h->list, list) {
L
Linus Torvalds 已提交
786 787
		c->state = BT_CLOSED;

788
		hci_proto_disconn_cfm(c, HCI_ERROR_LOCAL_HOST_TERM);
L
Linus Torvalds 已提交
789 790 791 792
		hci_conn_del(c);
	}
}

793 794 795 796 797 798 799 800 801 802 803
/* 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)
804
		hci_acl_create_connection(conn);
805 806 807 808

	hci_dev_unlock(hdev);
}

809 810 811 812 813 814 815 816 817 818 819 820 821
void hci_conn_hold_device(struct hci_conn *conn)
{
	atomic_inc(&conn->devref);
}
EXPORT_SYMBOL(hci_conn_hold_device);

void hci_conn_put_device(struct hci_conn *conn)
{
	if (atomic_dec_and_test(&conn->devref))
		hci_conn_del_sysfs(conn);
}
EXPORT_SYMBOL(hci_conn_put_device);

L
Linus Torvalds 已提交
822 823
int hci_get_conn_list(void __user *arg)
{
824
	struct hci_conn *c;
L
Linus Torvalds 已提交
825 826 827 828 829 830 831 832 833 834 835 836 837
	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 已提交
838 839
	cl = kmalloc(size, GFP_KERNEL);
	if (!cl)
L
Linus Torvalds 已提交
840 841
		return -ENOMEM;

A
Andrei Emeltchenko 已提交
842 843
	hdev = hci_dev_get(req.dev_id);
	if (!hdev) {
L
Linus Torvalds 已提交
844 845 846 847 848 849
		kfree(cl);
		return -ENODEV;
	}

	ci = cl->conn_info;

850
	hci_dev_lock(hdev);
851
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
L
Linus Torvalds 已提交
852 853 854 855 856 857 858 859 860
		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;
	}
861
	hci_dev_unlock(hdev);
L
Linus Torvalds 已提交
862 863 864 865 866 867 868 869 870 871 872 873 874 875 876 877 878 879 880 881 882 883 884

	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;

885
	hci_dev_lock(hdev);
L
Linus Torvalds 已提交
886 887 888 889 890 891 892 893 894
	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;
	}
895
	hci_dev_unlock(hdev);
L
Linus Torvalds 已提交
896 897 898 899 900 901

	if (!conn)
		return -ENOENT;

	return copy_to_user(ptr, &ci, sizeof(ci)) ? -EFAULT : 0;
}
902 903 904 905 906 907 908 909 910

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;

911
	hci_dev_lock(hdev);
912 913 914
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &req.bdaddr);
	if (conn)
		req.type = conn->auth_type;
915
	hci_dev_unlock(hdev);
916 917 918 919 920 921

	if (!conn)
		return -ENOENT;

	return copy_to_user(arg, &req, sizeof(req)) ? -EFAULT : 0;
}
922 923 924 925 926 927

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

928
	BT_DBG("%s hcon %p", hdev->name, conn);
929

930
	chan = kzalloc(sizeof(struct hci_chan), GFP_KERNEL);
931 932 933 934 935 936
	if (!chan)
		return NULL;

	chan->conn = conn;
	skb_queue_head_init(&chan->data_q);

937
	list_add_rcu(&chan->list, &conn->chan_list);
938 939 940 941

	return chan;
}

942
void hci_chan_del(struct hci_chan *chan)
943 944 945 946
{
	struct hci_conn *conn = chan->conn;
	struct hci_dev *hdev = conn->hdev;

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

949 950 951
	list_del_rcu(&chan->list);

	synchronize_rcu();
952 953 954 955 956

	skb_queue_purge(&chan->data_q);
	kfree(chan);
}

957
void hci_chan_list_flush(struct hci_conn *conn)
958
{
959
	struct hci_chan *chan, *n;
960

961
	BT_DBG("hcon %p", conn);
962

963
	list_for_each_entry_safe(chan, n, &conn->chan_list, list)
964 965
		hci_chan_del(chan);
}