mgmt.c 94.9 KB
Newer Older
1 2
/*
   BlueZ - Bluetooth protocol stack for Linux
3

4
   Copyright (C) 2010  Nokia Corporation
5
   Copyright (C) 2011-2012 Intel Corporation
6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26

   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
   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
   OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.

   ALL LIABILITY, INCLUDING LIABILITY FOR INFRINGEMENT OF ANY PATENTS,
   COPYRIGHTS, TRADEMARKS OR OTHER RIGHTS, RELATING TO USE OF THIS
   SOFTWARE IS DISCLAIMED.
*/

/* Bluetooth HCI Management interface */

27
#include <linux/module.h>
28 29 30 31 32
#include <asm/unaligned.h>

#include <net/bluetooth/bluetooth.h>
#include <net/bluetooth/hci_core.h>
#include <net/bluetooth/mgmt.h>
33
#include <net/bluetooth/smp.h>
34

35 36
bool enable_hs;

37
#define MGMT_VERSION	1
38
#define MGMT_REVISION	3
39

40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77
static const u16 mgmt_commands[] = {
	MGMT_OP_READ_INDEX_LIST,
	MGMT_OP_READ_INFO,
	MGMT_OP_SET_POWERED,
	MGMT_OP_SET_DISCOVERABLE,
	MGMT_OP_SET_CONNECTABLE,
	MGMT_OP_SET_FAST_CONNECTABLE,
	MGMT_OP_SET_PAIRABLE,
	MGMT_OP_SET_LINK_SECURITY,
	MGMT_OP_SET_SSP,
	MGMT_OP_SET_HS,
	MGMT_OP_SET_LE,
	MGMT_OP_SET_DEV_CLASS,
	MGMT_OP_SET_LOCAL_NAME,
	MGMT_OP_ADD_UUID,
	MGMT_OP_REMOVE_UUID,
	MGMT_OP_LOAD_LINK_KEYS,
	MGMT_OP_LOAD_LONG_TERM_KEYS,
	MGMT_OP_DISCONNECT,
	MGMT_OP_GET_CONNECTIONS,
	MGMT_OP_PIN_CODE_REPLY,
	MGMT_OP_PIN_CODE_NEG_REPLY,
	MGMT_OP_SET_IO_CAPABILITY,
	MGMT_OP_PAIR_DEVICE,
	MGMT_OP_CANCEL_PAIR_DEVICE,
	MGMT_OP_UNPAIR_DEVICE,
	MGMT_OP_USER_CONFIRM_REPLY,
	MGMT_OP_USER_CONFIRM_NEG_REPLY,
	MGMT_OP_USER_PASSKEY_REPLY,
	MGMT_OP_USER_PASSKEY_NEG_REPLY,
	MGMT_OP_READ_LOCAL_OOB_DATA,
	MGMT_OP_ADD_REMOTE_OOB_DATA,
	MGMT_OP_REMOVE_REMOTE_OOB_DATA,
	MGMT_OP_START_DISCOVERY,
	MGMT_OP_STOP_DISCOVERY,
	MGMT_OP_CONFIRM_NAME,
	MGMT_OP_BLOCK_DEVICE,
	MGMT_OP_UNBLOCK_DEVICE,
78
	MGMT_OP_SET_DEVICE_ID,
79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101
};

static const u16 mgmt_events[] = {
	MGMT_EV_CONTROLLER_ERROR,
	MGMT_EV_INDEX_ADDED,
	MGMT_EV_INDEX_REMOVED,
	MGMT_EV_NEW_SETTINGS,
	MGMT_EV_CLASS_OF_DEV_CHANGED,
	MGMT_EV_LOCAL_NAME_CHANGED,
	MGMT_EV_NEW_LINK_KEY,
	MGMT_EV_NEW_LONG_TERM_KEY,
	MGMT_EV_DEVICE_CONNECTED,
	MGMT_EV_DEVICE_DISCONNECTED,
	MGMT_EV_CONNECT_FAILED,
	MGMT_EV_PIN_CODE_REQUEST,
	MGMT_EV_USER_CONFIRM_REQUEST,
	MGMT_EV_USER_PASSKEY_REQUEST,
	MGMT_EV_AUTH_FAILED,
	MGMT_EV_DEVICE_FOUND,
	MGMT_EV_DISCOVERING,
	MGMT_EV_DEVICE_BLOCKED,
	MGMT_EV_DEVICE_UNBLOCKED,
	MGMT_EV_DEVICE_UNPAIRED,
102
	MGMT_EV_PASSKEY_NOTIFY,
103 104
};

105 106 107 108 109 110 111 112
/*
 * These LE scan and inquiry parameters were chosen according to LE General
 * Discovery Procedure specification.
 */
#define LE_SCAN_TYPE			0x01
#define LE_SCAN_WIN			0x12
#define LE_SCAN_INT			0x12
#define LE_SCAN_TIMEOUT_LE_ONLY		10240	/* TGAP(gen_disc_scan_min) */
113
#define LE_SCAN_TIMEOUT_BREDR_LE	5120	/* TGAP(100)/2 */
114

A
Andre Guedes 已提交
115
#define INQUIRY_LEN_BREDR		0x08	/* TGAP(100) */
116
#define INQUIRY_LEN_BREDR_LE		0x04	/* TGAP(100)/2 */
A
Andre Guedes 已提交
117

118
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
119

120 121 122
#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
				!test_bit(HCI_AUTO_OFF, &hdev->dev_flags))

123 124
struct pending_cmd {
	struct list_head list;
125
	u16 opcode;
126
	int index;
127
	void *param;
128
	struct sock *sk;
129
	void *user_data;
130 131
};

132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196
/* HCI to MGMT error code conversion table */
static u8 mgmt_status_table[] = {
	MGMT_STATUS_SUCCESS,
	MGMT_STATUS_UNKNOWN_COMMAND,	/* Unknown Command */
	MGMT_STATUS_NOT_CONNECTED,	/* No Connection */
	MGMT_STATUS_FAILED,		/* Hardware Failure */
	MGMT_STATUS_CONNECT_FAILED,	/* Page Timeout */
	MGMT_STATUS_AUTH_FAILED,	/* Authentication Failed */
	MGMT_STATUS_NOT_PAIRED,		/* PIN or Key Missing */
	MGMT_STATUS_NO_RESOURCES,	/* Memory Full */
	MGMT_STATUS_TIMEOUT,		/* Connection Timeout */
	MGMT_STATUS_NO_RESOURCES,	/* Max Number of Connections */
	MGMT_STATUS_NO_RESOURCES,	/* Max Number of SCO Connections */
	MGMT_STATUS_ALREADY_CONNECTED,	/* ACL Connection Exists */
	MGMT_STATUS_BUSY,		/* Command Disallowed */
	MGMT_STATUS_NO_RESOURCES,	/* Rejected Limited Resources */
	MGMT_STATUS_REJECTED,		/* Rejected Security */
	MGMT_STATUS_REJECTED,		/* Rejected Personal */
	MGMT_STATUS_TIMEOUT,		/* Host Timeout */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Feature */
	MGMT_STATUS_INVALID_PARAMS,	/* Invalid Parameters */
	MGMT_STATUS_DISCONNECTED,	/* OE User Ended Connection */
	MGMT_STATUS_NO_RESOURCES,	/* OE Low Resources */
	MGMT_STATUS_DISCONNECTED,	/* OE Power Off */
	MGMT_STATUS_DISCONNECTED,	/* Connection Terminated */
	MGMT_STATUS_BUSY,		/* Repeated Attempts */
	MGMT_STATUS_REJECTED,		/* Pairing Not Allowed */
	MGMT_STATUS_FAILED,		/* Unknown LMP PDU */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported Remote Feature */
	MGMT_STATUS_REJECTED,		/* SCO Offset Rejected */
	MGMT_STATUS_REJECTED,		/* SCO Interval Rejected */
	MGMT_STATUS_REJECTED,		/* Air Mode Rejected */
	MGMT_STATUS_INVALID_PARAMS,	/* Invalid LMP Parameters */
	MGMT_STATUS_FAILED,		/* Unspecified Error */
	MGMT_STATUS_NOT_SUPPORTED,	/* Unsupported LMP Parameter Value */
	MGMT_STATUS_FAILED,		/* Role Change Not Allowed */
	MGMT_STATUS_TIMEOUT,		/* LMP Response Timeout */
	MGMT_STATUS_FAILED,		/* LMP Error Transaction Collision */
	MGMT_STATUS_FAILED,		/* LMP PDU Not Allowed */
	MGMT_STATUS_REJECTED,		/* Encryption Mode Not Accepted */
	MGMT_STATUS_FAILED,		/* Unit Link Key Used */
	MGMT_STATUS_NOT_SUPPORTED,	/* QoS Not Supported */
	MGMT_STATUS_TIMEOUT,		/* Instant Passed */
	MGMT_STATUS_NOT_SUPPORTED,	/* Pairing Not Supported */
	MGMT_STATUS_FAILED,		/* Transaction Collision */
	MGMT_STATUS_INVALID_PARAMS,	/* Unacceptable Parameter */
	MGMT_STATUS_REJECTED,		/* QoS Rejected */
	MGMT_STATUS_NOT_SUPPORTED,	/* Classification Not Supported */
	MGMT_STATUS_REJECTED,		/* Insufficient Security */
	MGMT_STATUS_INVALID_PARAMS,	/* Parameter Out Of Range */
	MGMT_STATUS_BUSY,		/* Role Switch Pending */
	MGMT_STATUS_FAILED,		/* Slot Violation */
	MGMT_STATUS_FAILED,		/* Role Switch Failed */
	MGMT_STATUS_INVALID_PARAMS,	/* EIR Too Large */
	MGMT_STATUS_NOT_SUPPORTED,	/* Simple Pairing Not Supported */
	MGMT_STATUS_BUSY,		/* Host Busy Pairing */
	MGMT_STATUS_REJECTED,		/* Rejected, No Suitable Channel */
	MGMT_STATUS_BUSY,		/* Controller Busy */
	MGMT_STATUS_INVALID_PARAMS,	/* Unsuitable Connection Interval */
	MGMT_STATUS_TIMEOUT,		/* Directed Advertising Timeout */
	MGMT_STATUS_AUTH_FAILED,	/* Terminated Due to MIC Failure */
	MGMT_STATUS_CONNECT_FAILED,	/* Connection Establishment Failed */
	MGMT_STATUS_CONNECT_FAILED,	/* MAC Connection Failed */
};

197 198 199 200 201
bool mgmt_valid_hdev(struct hci_dev *hdev)
{
	return hdev->dev_type == HCI_BREDR;
}

202 203 204 205 206 207 208 209
static u8 mgmt_status(u8 hci_status)
{
	if (hci_status < ARRAY_SIZE(mgmt_status_table))
		return mgmt_status_table[hci_status];

	return MGMT_STATUS_FAILED;
}

210
static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
211 212 213 214
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_status *ev;
215
	int err;
216

217
	BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
218

219
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
220 221 222 223 224
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));

225
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_STATUS);
226
	hdr->index = cpu_to_le16(index);
227 228 229 230
	hdr->len = cpu_to_le16(sizeof(*ev));

	ev = (void *) skb_put(skb, sizeof(*ev));
	ev->status = status;
231
	ev->opcode = cpu_to_le16(cmd);
232

233 234
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
235 236
		kfree_skb(skb);

237
	return err;
238 239
}

240
static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
241
			void *rp, size_t rp_len)
242 243 244 245
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_complete *ev;
246
	int err;
247 248 249

	BT_DBG("sock %p", sk);

250
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
251 252 253 254 255
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));

256
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE);
257
	hdr->index = cpu_to_le16(index);
258
	hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
259

260
	ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
261
	ev->opcode = cpu_to_le16(cmd);
262
	ev->status = status;
263 264 265

	if (rp)
		memcpy(ev->data, rp, rp_len);
266

267 268
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
269 270
		kfree_skb(skb);

271
	return err;
272 273
}

274 275
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
276 277 278 279 280 281
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

	rp.version = MGMT_VERSION;
282
	rp.revision = __constant_cpu_to_le16(MGMT_REVISION);
283

284
	return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
285
			    sizeof(rp));
286 287
}

288 289
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
290 291
{
	struct mgmt_rp_read_commands *rp;
292 293
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
294
	__le16 *opcode;
295 296 297 298 299 300 301 302 303 304 305
	size_t rp_size;
	int i, err;

	BT_DBG("sock %p", sk);

	rp_size = sizeof(*rp) + ((num_commands + num_events) * sizeof(u16));

	rp = kmalloc(rp_size, GFP_KERNEL);
	if (!rp)
		return -ENOMEM;

306 307
	rp->num_commands = __constant_cpu_to_le16(num_commands);
	rp->num_events = __constant_cpu_to_le16(num_events);
308 309 310 311 312 313 314

	for (i = 0, opcode = rp->opcodes; i < num_commands; i++, opcode++)
		put_unaligned_le16(mgmt_commands[i], opcode);

	for (i = 0; i < num_events; i++, opcode++)
		put_unaligned_le16(mgmt_events[i], opcode);

315
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
316
			   rp_size);
317 318 319 320 321
	kfree(rp);

	return err;
}

322 323
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
324 325
{
	struct mgmt_rp_read_index_list *rp;
326
	struct hci_dev *d;
327
	size_t rp_len;
328
	u16 count;
329
	int err;
330 331 332 333 334 335

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
336 337 338 339
	list_for_each_entry(d, &hci_dev_list, list) {
		if (!mgmt_valid_hdev(d))
			continue;

340 341 342
		count++;
	}

343 344 345
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
346
		read_unlock(&hci_dev_list_lock);
347
		return -ENOMEM;
348
	}
349

350
	count = 0;
351
	list_for_each_entry(d, &hci_dev_list, list) {
352
		if (test_bit(HCI_SETUP, &d->dev_flags))
353 354
			continue;

355 356 357
		if (!mgmt_valid_hdev(d))
			continue;

358
		rp->index[count++] = cpu_to_le16(d->id);
359 360 361
		BT_DBG("Added hci%u", d->id);
	}

362 363 364
	rp->num_controllers = cpu_to_le16(count);
	rp_len = sizeof(*rp) + (2 * count);

365 366
	read_unlock(&hci_dev_list_lock);

367
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
368
			   rp_len);
369

370 371 372
	kfree(rp);

	return err;
373 374
}

375 376 377 378 379 380 381
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

382
	if (lmp_ssp_capable(hdev))
383 384
		settings |= MGMT_SETTING_SSP;

385
	if (lmp_bredr_capable(hdev)) {
386
		settings |= MGMT_SETTING_CONNECTABLE;
387 388
		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
			settings |= MGMT_SETTING_FAST_CONNECTABLE;
389
		settings |= MGMT_SETTING_DISCOVERABLE;
390 391 392 393
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
	}

394 395 396
	if (enable_hs)
		settings |= MGMT_SETTING_HS;

397
	if (lmp_le_capable(hdev))
398
		settings |= MGMT_SETTING_LE;
399 400 401 402 403 404 405 406

	return settings;
}

static u32 get_current_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

407
	if (hdev_is_powered(hdev))
408 409
		settings |= MGMT_SETTING_POWERED;

410
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
411 412
		settings |= MGMT_SETTING_CONNECTABLE;

413 414 415
	if (test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
		settings |= MGMT_SETTING_FAST_CONNECTABLE;

416
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
417 418
		settings |= MGMT_SETTING_DISCOVERABLE;

419
	if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
420 421
		settings |= MGMT_SETTING_PAIRABLE;

422
	if (lmp_bredr_capable(hdev))
423 424
		settings |= MGMT_SETTING_BREDR;

425
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
426 427
		settings |= MGMT_SETTING_LE;

428
	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
429 430
		settings |= MGMT_SETTING_LINK_SECURITY;

431
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
432 433
		settings |= MGMT_SETTING_SSP;

434 435 436
	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
		settings |= MGMT_SETTING_HS;

437 438 439
	return settings;
}

440 441
#define PNP_INFO_SVCLASS_ID		0x1200

442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483
static u8 *create_uuid16_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 4)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		u16 uuid16;

		if (uuid->size != 16)
			continue;

		uuid16 = get_unaligned_le16(&uuid->uuid[12]);
		if (uuid16 < 0x1100)
			continue;

		if (uuid16 == PNP_INFO_SVCLASS_ID)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID16_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u16) > len) {
			uuids_start[1] = EIR_UUID16_SOME;
			break;
		}

		*ptr++ = (uuid16 & 0x00ff);
		*ptr++ = (uuid16 & 0xff00) >> 8;
		uuids_start[0] += sizeof(uuid16);
	}

	return ptr;
}

484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516
static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 6)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 32)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID32_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + sizeof(u32) > len) {
			uuids_start[1] = EIR_UUID32_SOME;
			break;
		}

		memcpy(ptr, &uuid->uuid[12], sizeof(u32));
		ptr += sizeof(u32);
		uuids_start[0] += sizeof(u32);
	}

	return ptr;
}

517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549
static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 18)
		return ptr;

	list_for_each_entry(uuid, &hdev->uuids, list) {
		if (uuid->size != 128)
			continue;

		if (!uuids_start) {
			uuids_start = ptr;
			uuids_start[0] = 1;
			uuids_start[1] = EIR_UUID128_ALL;
			ptr += 2;
		}

		/* Stop if not enough space to put next UUID */
		if ((ptr - data) + 16 > len) {
			uuids_start[1] = EIR_UUID128_SOME;
			break;
		}

		memcpy(ptr, uuid->uuid, 16);
		ptr += 16;
		uuids_start[0] += 16;
	}

	return ptr;
}

550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572
static void create_eir(struct hci_dev *hdev, u8 *data)
{
	u8 *ptr = data;
	size_t name_len;

	name_len = strlen(hdev->dev_name);

	if (name_len > 0) {
		/* EIR Data type */
		if (name_len > 48) {
			name_len = 48;
			ptr[1] = EIR_NAME_SHORT;
		} else
			ptr[1] = EIR_NAME_COMPLETE;

		/* EIR Data length */
		ptr[0] = name_len + 1;

		memcpy(ptr + 2, hdev->dev_name, name_len);

		ptr += (name_len + 2);
	}

573
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
574 575 576 577 578 579 580
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

581 582 583 584 585 586 587 588 589 590 591 592
	if (hdev->devid_source > 0) {
		ptr[0] = 9;
		ptr[1] = EIR_DEVICE_ID;

		put_unaligned_le16(hdev->devid_source, ptr + 2);
		put_unaligned_le16(hdev->devid_vendor, ptr + 4);
		put_unaligned_le16(hdev->devid_product, ptr + 6);
		put_unaligned_le16(hdev->devid_version, ptr + 8);

		ptr += 10;
	}

593
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
594
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
595
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
596 597
}

598
static void update_eir(struct hci_request *req)
599
{
600
	struct hci_dev *hdev = req->hdev;
601 602
	struct hci_cp_write_eir cp;

603
	if (!hdev_is_powered(hdev))
604
		return;
605

606
	if (!lmp_ext_inq_capable(hdev))
607
		return;
608

609
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
610
		return;
611

612
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
613
		return;
614 615 616 617 618 619

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

	create_eir(hdev, cp.data);

	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
620
		return;
621 622 623

	memcpy(hdev->eir, cp.data, sizeof(cp.data));

624
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
625 626 627 628 629 630 631 632 633 634 635 636 637
}

static u8 get_service_classes(struct hci_dev *hdev)
{
	struct bt_uuid *uuid;
	u8 val = 0;

	list_for_each_entry(uuid, &hdev->uuids, list)
		val |= uuid->svc_hint;

	return val;
}

638
static void update_class(struct hci_request *req)
639
{
640
	struct hci_dev *hdev = req->hdev;
641 642 643 644
	u8 cod[3];

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

645
	if (!hdev_is_powered(hdev))
646
		return;
647

648
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
649
		return;
650 651 652 653 654 655

	cod[0] = hdev->minor_class;
	cod[1] = hdev->major_class;
	cod[2] = get_service_classes(hdev);

	if (memcmp(cod, hdev->dev_class, 3) == 0)
656
		return;
657

658
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
659 660
}

661 662 663
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
664
					    service_cache.work);
665
	struct hci_request req;
666

667
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
668 669
		return;

670 671
	hci_req_init(&req, hdev);

672 673
	hci_dev_lock(hdev);

674 675
	update_eir(&req);
	update_class(&req);
676 677

	hci_dev_unlock(hdev);
678 679

	hci_req_run(&req, NULL);
680 681
}

682
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
683
{
684
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
685 686
		return;

687
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
688

689 690 691 692 693 694
	/* Non-mgmt controlled devices get this bit set
	 * implicitly so that pairing works for them, however
	 * for mgmt we require user-space to explicitly enable
	 * it
	 */
	clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
695 696
}

697
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
698
				void *data, u16 data_len)
699
{
700
	struct mgmt_rp_read_info rp;
701

702
	BT_DBG("sock %p %s", sk, hdev->name);
703

704
	hci_dev_lock(hdev);
705

706 707
	memset(&rp, 0, sizeof(rp));

708
	bacpy(&rp.bdaddr, &hdev->bdaddr);
709

710
	rp.version = hdev->hci_ver;
711
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
712 713 714

	rp.supported_settings = cpu_to_le32(get_supported_settings(hdev));
	rp.current_settings = cpu_to_le32(get_current_settings(hdev));
715

716
	memcpy(rp.dev_class, hdev->dev_class, 3);
717

718
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
719
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
720

721
	hci_dev_unlock(hdev);
722

723
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
724
			    sizeof(rp));
725 726
}

727 728 729
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
730
	kfree(cmd->param);
731 732 733
	kfree(cmd);
}

734
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
735 736
					    struct hci_dev *hdev, void *data,
					    u16 len)
737 738 739
{
	struct pending_cmd *cmd;

740
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
741
	if (!cmd)
742
		return NULL;
743 744

	cmd->opcode = opcode;
745
	cmd->index = hdev->id;
746

747
	cmd->param = kmalloc(len, GFP_KERNEL);
748
	if (!cmd->param) {
749
		kfree(cmd);
750
		return NULL;
751 752
	}

753 754
	if (data)
		memcpy(cmd->param, data, len);
755 756 757 758

	cmd->sk = sk;
	sock_hold(sk);

759
	list_add(&cmd->list, &hdev->mgmt_pending);
760

761
	return cmd;
762 763
}

764
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
765 766
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
767
				 void *data)
768
{
769
	struct pending_cmd *cmd, *tmp;
770

771
	list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
772
		if (opcode > 0 && cmd->opcode != opcode)
773 774 775 776 777 778
			continue;

		cb(cmd, data);
	}
}

779
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
780
{
781
	struct pending_cmd *cmd;
782

783
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
784 785
		if (cmd->opcode == opcode)
			return cmd;
786 787 788 789 790
	}

	return NULL;
}

791
static void mgmt_pending_remove(struct pending_cmd *cmd)
792 793 794 795 796
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

797
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
798
{
799
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
800

801
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
802
			    sizeof(settings));
803 804
}

805
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
806
		       u16 len)
807
{
808
	struct mgmt_mode *cp = data;
809
	struct pending_cmd *cmd;
810
	int err;
811

812
	BT_DBG("request for %s", hdev->name);
813

814 815 816 817
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

818
	hci_dev_lock(hdev);
819

820 821 822 823
	if (test_and_clear_bit(HCI_AUTO_OFF, &hdev->dev_flags)) {
		cancel_delayed_work(&hdev->power_off);

		if (cp->val) {
824 825 826
			mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev,
					 data, len);
			err = mgmt_powered(hdev, 1);
827 828 829 830
			goto failed;
		}
	}

831
	if (!!cp->val == hdev_is_powered(hdev)) {
832
		err = send_settings_rsp(sk, MGMT_OP_SET_POWERED, hdev);
833 834 835
		goto failed;
	}

836
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
837
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
838
				 MGMT_STATUS_BUSY);
839 840 841
		goto failed;
	}

842
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
843 844
	if (!cmd) {
		err = -ENOMEM;
845
		goto failed;
846
	}
847

848
	if (cp->val)
849
		queue_work(hdev->req_workqueue, &hdev->power_on);
850
	else
851
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
852

853
	err = 0;
854 855

failed:
856
	hci_dev_unlock(hdev);
857
	return err;
858 859
}

860 861
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
862 863 864 865
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

866
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
867 868 869 870 871 872 873 874
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));
	hdr->opcode = cpu_to_le16(event);
	if (hdev)
		hdr->index = cpu_to_le16(hdev->id);
	else
875
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
876 877 878 879 880
	hdr->len = cpu_to_le16(data_len);

	if (data)
		memcpy(skb_put(skb, data_len), data, data_len);

881 882 883
	/* Time stamp */
	__net_timestamp(skb);

884 885 886 887 888 889 890 891 892 893 894 895 896 897 898
	hci_send_to_control(skb, skip_sk);
	kfree_skb(skb);

	return 0;
}

static int new_settings(struct hci_dev *hdev, struct sock *skip)
{
	__le32 ev;

	ev = cpu_to_le32(get_current_settings(hdev));

	return mgmt_event(MGMT_EV_NEW_SETTINGS, hdev, &ev, sizeof(ev), skip);
}

899
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
900
			    u16 len)
901
{
902
	struct mgmt_cp_set_discoverable *cp = data;
903
	struct pending_cmd *cmd;
904
	u16 timeout;
905 906 907
	u8 scan;
	int err;

908
	BT_DBG("request for %s", hdev->name);
909

910 911 912 913
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				 MGMT_STATUS_NOT_SUPPORTED);

914 915 916 917
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

918
	timeout = __le16_to_cpu(cp->timeout);
919
	if (!cp->val && timeout > 0)
920
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
921
				  MGMT_STATUS_INVALID_PARAMS);
922

923
	hci_dev_lock(hdev);
924

925
	if (!hdev_is_powered(hdev) && timeout > 0) {
926
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
927
				 MGMT_STATUS_NOT_POWERED);
928 929 930
		goto failed;
	}

931
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
932
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
933
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
934
				 MGMT_STATUS_BUSY);
935 936 937
		goto failed;
	}

938
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
939
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
940
				 MGMT_STATUS_REJECTED);
941 942 943 944
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
945 946 947 948 949 950 951
		bool changed = false;

		if (!!cp->val != test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
			change_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
			changed = true;
		}

952
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
953 954 955 956 957 958
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

959 960 961 962
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
963 964 965 966 967 968 969 970 971 972 973
		if (hdev->discov_timeout > 0) {
			cancel_delayed_work(&hdev->discov_off);
			hdev->discov_timeout = 0;
		}

		if (cp->val && timeout > 0) {
			hdev->discov_timeout = timeout;
			queue_delayed_work(hdev->workqueue, &hdev->discov_off,
				msecs_to_jiffies(hdev->discov_timeout * 1000));
		}

974
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
975 976 977
		goto failed;
	}

978
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
979 980
	if (!cmd) {
		err = -ENOMEM;
981
		goto failed;
982
	}
983 984 985

	scan = SCAN_PAGE;

986
	if (cp->val)
987
		scan |= SCAN_INQUIRY;
988
	else
989
		cancel_delayed_work(&hdev->discov_off);
990 991 992

	err = hci_send_cmd(hdev, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
	if (err < 0)
993
		mgmt_pending_remove(cmd);
994

995
	if (cp->val)
996
		hdev->discov_timeout = timeout;
997

998
failed:
999
	hci_dev_unlock(hdev);
1000 1001 1002
	return err;
}

1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
	if (!cmd)
		goto unlock;

	send_settings_rsp(cmd->sk, MGMT_OP_SET_CONNECTABLE, hdev);

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

1023
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1024
			   u16 len)
1025
{
1026
	struct mgmt_mode *cp = data;
1027
	struct pending_cmd *cmd;
1028
	struct hci_request req;
1029 1030 1031
	u8 scan;
	int err;

1032
	BT_DBG("request for %s", hdev->name);
1033

1034 1035 1036 1037
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

1038 1039 1040 1041
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1042
	hci_dev_lock(hdev);
1043

1044
	if (!hdev_is_powered(hdev)) {
1045 1046 1047 1048 1049
		bool changed = false;

		if (!!cp->val != test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;

1050
		if (cp->val) {
1051
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1052
		} else {
1053 1054 1055
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1056

1057
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1058 1059 1060 1061 1062 1063
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1064 1065 1066
		goto failed;
	}

1067
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1068
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1069
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1070
				 MGMT_STATUS_BUSY);
1071 1072 1073
		goto failed;
	}

1074
	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1075
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1076 1077 1078
		goto failed;
	}

1079
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1080 1081
	if (!cmd) {
		err = -ENOMEM;
1082
		goto failed;
1083
	}
1084

1085
	if (cp->val) {
1086
		scan = SCAN_PAGE;
1087
	} else {
1088 1089
		scan = 0;

1090
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1091
		    hdev->discov_timeout > 0)
1092 1093 1094
			cancel_delayed_work(&hdev->discov_off);
	}

1095 1096 1097 1098 1099
	hci_req_init(&req, hdev);

	hci_req_add(&req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);

	err = hci_req_run(&req, set_connectable_complete);
1100
	if (err < 0)
1101
		mgmt_pending_remove(cmd);
1102 1103

failed:
1104
	hci_dev_unlock(hdev);
1105 1106 1107
	return err;
}

1108
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1109
			u16 len)
1110
{
1111
	struct mgmt_mode *cp = data;
1112 1113
	int err;

1114
	BT_DBG("request for %s", hdev->name);
1115

1116 1117 1118 1119
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1120
	hci_dev_lock(hdev);
1121 1122

	if (cp->val)
1123
		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1124
	else
1125
		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1126

1127
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1128 1129 1130
	if (err < 0)
		goto failed;

1131
	err = new_settings(hdev, sk);
1132 1133

failed:
1134
	hci_dev_unlock(hdev);
1135 1136 1137
	return err;
}

1138 1139
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1140 1141 1142
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1143
	u8 val;
1144 1145
	int err;

1146
	BT_DBG("request for %s", hdev->name);
1147

1148 1149 1150 1151
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_NOT_SUPPORTED);

1152 1153 1154 1155
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1156 1157
	hci_dev_lock(hdev);

1158
	if (!hdev_is_powered(hdev)) {
1159 1160 1161
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1162
					  &hdev->dev_flags)) {
1163 1164 1165 1166 1167 1168 1169 1170 1171 1172 1173
			change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1174 1175 1176 1177
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1178
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1179
				 MGMT_STATUS_BUSY);
1180 1181 1182 1183 1184 1185 1186 1187 1188 1189 1190 1191 1192 1193 1194 1195 1196 1197 1198 1199 1200 1201 1202 1203 1204 1205 1206
		goto failed;
	}

	val = !!cp->val;

	if (test_bit(HCI_AUTH, &hdev->flags) == val) {
		err = send_settings_rsp(sk, MGMT_OP_SET_LINK_SECURITY, hdev);
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LINK_SECURITY, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

	err = hci_send_cmd(hdev, HCI_OP_WRITE_AUTH_ENABLE, sizeof(val), &val);
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1207
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1208 1209 1210
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1211
	u8 val;
1212 1213
	int err;

1214
	BT_DBG("request for %s", hdev->name);
1215

1216 1217 1218
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1219

1220 1221 1222 1223
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1224
	hci_dev_lock(hdev);
1225

1226 1227
	val = !!cp->val;

1228
	if (!hdev_is_powered(hdev)) {
1229 1230 1231 1232 1233 1234 1235 1236 1237 1238 1239 1240 1241 1242
		bool changed = false;

		if (val != test_bit(HCI_SSP_ENABLED, &hdev->dev_flags)) {
			change_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
		if (err < 0)
			goto failed;

		if (changed)
			err = new_settings(hdev, sk);

1243 1244 1245 1246
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1247 1248
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270 1271 1272 1273
		goto failed;
	}

	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) == val) {
		err = send_settings_rsp(sk, MGMT_OP_SET_SSP, hdev);
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_SSP, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

	err = hci_send_cmd(hdev, HCI_OP_WRITE_SSP_MODE, sizeof(val), &val);
	if (err < 0) {
		mgmt_pending_remove(cmd);
		goto failed;
	}

failed:
	hci_dev_unlock(hdev);
	return err;
}

1274
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1275 1276 1277
{
	struct mgmt_mode *cp = data;

1278
	BT_DBG("request for %s", hdev->name);
1279

1280 1281
	if (!enable_hs)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1282
				  MGMT_STATUS_NOT_SUPPORTED);
1283

1284 1285 1286 1287
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1288 1289 1290 1291 1292
	if (cp->val)
		set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
	else
		clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);

1293
	return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1294 1295
}

1296
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1297 1298 1299 1300 1301
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
	int err;
1302
	u8 val, enabled;
1303

1304
	BT_DBG("request for %s", hdev->name);
1305

1306 1307 1308
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1309

1310 1311 1312 1313
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1314
	hci_dev_lock(hdev);
1315 1316

	val = !!cp->val;
1317
	enabled = lmp_host_le_capable(hdev);
1318

1319
	if (!hdev_is_powered(hdev) || val == enabled) {
1320 1321 1322 1323 1324 1325 1326 1327 1328
		bool changed = false;

		if (val != test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
			change_bit(HCI_LE_ENABLED, &hdev->dev_flags);
			changed = true;
		}

		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1329
			goto unlock;
1330 1331 1332 1333

		if (changed)
			err = new_settings(hdev, sk);

1334
		goto unlock;
1335 1336 1337
	}

	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
1338
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1339
				 MGMT_STATUS_BUSY);
1340
		goto unlock;
1341 1342 1343 1344 1345
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1346
		goto unlock;
1347 1348 1349 1350 1351 1352
	}

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

	if (val) {
		hci_cp.le = val;
1353
		hci_cp.simul = lmp_le_br_capable(hdev);
1354 1355
	}

1356 1357
	err = hci_send_cmd(hdev, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
			   &hci_cp);
1358
	if (err < 0)
1359 1360
		mgmt_pending_remove(cmd);

1361 1362
unlock:
	hci_dev_unlock(hdev);
1363 1364 1365
	return err;
}

1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388
/* This is a helper function to test for pending mgmt commands that can
 * cause CoD or EIR HCI commands. We can only allow one such pending
 * mgmt command at a time since otherwise we cannot easily track what
 * the current values are, will be, and based on that calculate if a new
 * HCI command needs to be sent and if yes with what value.
 */
static bool pending_eir_or_class(struct hci_dev *hdev)
{
	struct pending_cmd *cmd;

	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
		switch (cmd->opcode) {
		case MGMT_OP_ADD_UUID:
		case MGMT_OP_REMOVE_UUID:
		case MGMT_OP_SET_DEV_CLASS:
		case MGMT_OP_SET_POWERED:
			return true;
		}
	}

	return false;
}

1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399 1400 1401 1402 1403 1404 1405 1406 1407
static const u8 bluetooth_base_uuid[] = {
			0xfb, 0x34, 0x9b, 0x5f, 0x80, 0x00, 0x00, 0x80,
			0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
};

static u8 get_uuid_size(const u8 *uuid)
{
	u32 val;

	if (memcmp(uuid, bluetooth_base_uuid, 12))
		return 128;

	val = get_unaligned_le32(&uuid[12]);
	if (val > 0xffff)
		return 32;

	return 16;
}

1408 1409 1410 1411 1412 1413 1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
static void mgmt_class_complete(struct hci_dev *hdev, u16 mgmt_op, u8 status)
{
	struct pending_cmd *cmd;

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(mgmt_op, hdev);
	if (!cmd)
		goto unlock;

	cmd_complete(cmd->sk, cmd->index, cmd->opcode, mgmt_status(status),
		     hdev->dev_class, 3);

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static void add_uuid_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_ADD_UUID, status);
}

1434
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1435
{
1436
	struct mgmt_cp_add_uuid *cp = data;
1437
	struct pending_cmd *cmd;
1438
	struct hci_request req;
1439 1440 1441
	struct bt_uuid *uuid;
	int err;

1442
	BT_DBG("request for %s", hdev->name);
1443

1444
	hci_dev_lock(hdev);
1445

1446
	if (pending_eir_or_class(hdev)) {
1447
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1448
				 MGMT_STATUS_BUSY);
1449 1450 1451
		goto failed;
	}

1452
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1453 1454 1455 1456 1457 1458
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1459
	uuid->svc_hint = cp->svc_hint;
1460
	uuid->size = get_uuid_size(cp->uuid);
1461

1462
	list_add_tail(&uuid->list, &hdev->uuids);
1463

1464
	hci_req_init(&req, hdev);
1465

1466 1467 1468
	update_class(&req);
	update_eir(&req);

1469 1470 1471 1472
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1473

1474
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1475
				   hdev->dev_class, 3);
1476 1477 1478 1479
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1480
	if (!cmd) {
1481
		err = -ENOMEM;
1482 1483 1484 1485
		goto failed;
	}

	err = 0;
1486 1487

failed:
1488
	hci_dev_unlock(hdev);
1489 1490 1491
	return err;
}

1492 1493 1494 1495 1496 1497
static bool enable_service_cache(struct hci_dev *hdev)
{
	if (!hdev_is_powered(hdev))
		return false;

	if (!test_and_set_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1498 1499
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1500 1501 1502 1503 1504 1505
		return true;
	}

	return false;
}

1506 1507 1508 1509 1510 1511 1512
static void remove_uuid_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_REMOVE_UUID, status);
}

1513
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1514
		       u16 len)
1515
{
1516
	struct mgmt_cp_remove_uuid *cp = data;
1517
	struct pending_cmd *cmd;
1518
	struct bt_uuid *match, *tmp;
1519
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1520
	struct hci_request req;
1521 1522
	int err, found;

1523
	BT_DBG("request for %s", hdev->name);
1524

1525
	hci_dev_lock(hdev);
1526

1527
	if (pending_eir_or_class(hdev)) {
1528
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1529
				 MGMT_STATUS_BUSY);
1530 1531 1532
		goto unlock;
	}

1533 1534
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1535

1536
		if (enable_service_cache(hdev)) {
1537
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1538
					   0, hdev->dev_class, 3);
1539 1540
			goto unlock;
		}
1541

1542
		goto update_class;
1543 1544 1545 1546
	}

	found = 0;

1547
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1548 1549 1550 1551
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1552
		kfree(match);
1553 1554 1555 1556
		found++;
	}

	if (found == 0) {
1557
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1558
				 MGMT_STATUS_INVALID_PARAMS);
1559 1560 1561
		goto unlock;
	}

1562
update_class:
1563
	hci_req_init(&req, hdev);
1564

1565 1566 1567
	update_class(&req);
	update_eir(&req);

1568 1569 1570 1571
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1572

1573
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1574
				   hdev->dev_class, 3);
1575 1576 1577 1578
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1579
	if (!cmd) {
1580
		err = -ENOMEM;
1581 1582 1583 1584
		goto unlock;
	}

	err = 0;
1585 1586

unlock:
1587
	hci_dev_unlock(hdev);
1588 1589 1590
	return err;
}

1591 1592 1593 1594 1595 1596 1597
static void set_class_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status 0x%02x", status);

	mgmt_class_complete(hdev, MGMT_OP_SET_DEV_CLASS, status);
}

1598
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1599
			 u16 len)
1600
{
1601
	struct mgmt_cp_set_dev_class *cp = data;
1602
	struct pending_cmd *cmd;
1603
	struct hci_request req;
1604 1605
	int err;

1606
	BT_DBG("request for %s", hdev->name);
1607

1608 1609 1610
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1611

1612
	hci_dev_lock(hdev);
1613

1614 1615 1616 1617 1618
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1619

1620 1621 1622 1623 1624
	if ((cp->minor & 0x03) != 0 || (cp->major & 0xe0) != 0) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_INVALID_PARAMS);
		goto unlock;
	}
1625

1626 1627 1628
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1629
	if (!hdev_is_powered(hdev)) {
1630
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1631
				   hdev->dev_class, 3);
1632 1633 1634
		goto unlock;
	}

1635 1636
	hci_req_init(&req, hdev);

1637
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1638 1639 1640
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1641
		update_eir(&req);
1642
	}
1643

1644 1645
	update_class(&req);

1646 1647 1648 1649
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1650

1651
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1652
				   hdev->dev_class, 3);
1653 1654 1655 1656
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1657
	if (!cmd) {
1658
		err = -ENOMEM;
1659 1660 1661 1662
		goto unlock;
	}

	err = 0;
1663

1664
unlock:
1665
	hci_dev_unlock(hdev);
1666 1667 1668
	return err;
}

1669
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1670
			  u16 len)
1671
{
1672
	struct mgmt_cp_load_link_keys *cp = data;
1673
	u16 key_count, expected_len;
1674
	int i;
1675

1676
	key_count = __le16_to_cpu(cp->key_count);
1677

1678 1679
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1680
	if (expected_len != len) {
1681
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1682
		       len, expected_len);
1683
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1684
				  MGMT_STATUS_INVALID_PARAMS);
1685 1686
	}

1687 1688 1689 1690
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1691
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1692
	       key_count);
1693

1694 1695 1696 1697 1698 1699 1700 1701
	for (i = 0; i < key_count; i++) {
		struct mgmt_link_key_info *key = &cp->keys[i];

		if (key->addr.type != BDADDR_BREDR)
			return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

1702
	hci_dev_lock(hdev);
1703 1704 1705

	hci_link_keys_clear(hdev);

1706
	set_bit(HCI_LINK_KEYS, &hdev->dev_flags);
1707 1708

	if (cp->debug_keys)
1709
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1710
	else
1711
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1712

1713
	for (i = 0; i < key_count; i++) {
1714
		struct mgmt_link_key_info *key = &cp->keys[i];
1715

1716
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1717
				 key->type, key->pin_len);
1718 1719
	}

1720
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1721

1722
	hci_dev_unlock(hdev);
1723

1724
	return 0;
1725 1726
}

1727
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1728
			   u8 addr_type, struct sock *skip_sk)
1729 1730 1731 1732 1733 1734 1735
{
	struct mgmt_ev_device_unpaired ev;

	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = addr_type;

	return mgmt_event(MGMT_EV_DEVICE_UNPAIRED, hdev, &ev, sizeof(ev),
1736
			  skip_sk);
1737 1738
}

1739
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1740
			 u16 len)
1741
{
1742 1743
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1744 1745
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1746 1747 1748
	struct hci_conn *conn;
	int err;

1749
	memset(&rp, 0, sizeof(rp));
1750 1751
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1752

1753 1754 1755 1756 1757
	if (!bdaddr_type_is_valid(cp->addr.type))
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1758 1759 1760 1761 1762
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1763 1764
	hci_dev_lock(hdev);

1765
	if (!hdev_is_powered(hdev)) {
1766
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1767
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1768 1769 1770
		goto unlock;
	}

1771
	if (cp->addr.type == BDADDR_BREDR)
1772 1773 1774
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1775

1776
	if (err < 0) {
1777
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1778
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1779 1780 1781
		goto unlock;
	}

1782
	if (cp->disconnect) {
1783
		if (cp->addr.type == BDADDR_BREDR)
1784
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1785
						       &cp->addr.bdaddr);
1786 1787
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1788
						       &cp->addr.bdaddr);
1789 1790 1791
	} else {
		conn = NULL;
	}
1792

1793
	if (!conn) {
1794
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1795
				   &rp, sizeof(rp));
1796
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1797 1798
		goto unlock;
	}
1799

1800
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1801
			       sizeof(*cp));
1802 1803 1804
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1805 1806
	}

1807
	dc.handle = cpu_to_le16(conn->handle);
1808 1809 1810 1811 1812
	dc.reason = 0x13; /* Remote User Terminated Connection */
	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
		mgmt_pending_remove(cmd);

1813
unlock:
1814
	hci_dev_unlock(hdev);
1815 1816 1817
	return err;
}

1818
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1819
		      u16 len)
1820
{
1821
	struct mgmt_cp_disconnect *cp = data;
1822
	struct mgmt_rp_disconnect rp;
1823
	struct hci_cp_disconnect dc;
1824
	struct pending_cmd *cmd;
1825 1826 1827 1828 1829
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1830 1831 1832 1833
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1834
	if (!bdaddr_type_is_valid(cp->addr.type))
1835 1836 1837
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1838

1839
	hci_dev_lock(hdev);
1840 1841

	if (!test_bit(HCI_UP, &hdev->flags)) {
1842 1843
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1844 1845 1846
		goto failed;
	}

1847
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1848 1849
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1850 1851 1852
		goto failed;
	}

1853
	if (cp->addr.type == BDADDR_BREDR)
1854 1855
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
1856 1857
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1858

1859
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1860 1861
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1862 1863 1864
		goto failed;
	}

1865
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1866 1867
	if (!cmd) {
		err = -ENOMEM;
1868
		goto failed;
1869
	}
1870

1871
	dc.handle = cpu_to_le16(conn->handle);
1872
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1873 1874 1875

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
1876
		mgmt_pending_remove(cmd);
1877 1878

failed:
1879
	hci_dev_unlock(hdev);
1880 1881 1882
	return err;
}

1883
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
1884 1885 1886
{
	switch (link_type) {
	case LE_LINK:
1887 1888
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
1889
			return BDADDR_LE_PUBLIC;
1890

1891
		default:
1892
			/* Fallback to LE Random address type */
1893
			return BDADDR_LE_RANDOM;
1894
		}
1895

1896
	default:
1897
		/* Fallback to BR/EDR type */
1898
		return BDADDR_BREDR;
1899 1900 1901
	}
}

1902 1903
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
1904 1905
{
	struct mgmt_rp_get_connections *rp;
1906
	struct hci_conn *c;
1907
	size_t rp_len;
1908 1909
	int err;
	u16 i;
1910 1911 1912

	BT_DBG("");

1913
	hci_dev_lock(hdev);
1914

1915
	if (!hdev_is_powered(hdev)) {
1916
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
1917
				 MGMT_STATUS_NOT_POWERED);
1918 1919 1920
		goto unlock;
	}

1921
	i = 0;
1922 1923
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
1924
			i++;
1925 1926
	}

1927
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1928
	rp = kmalloc(rp_len, GFP_KERNEL);
1929
	if (!rp) {
1930 1931 1932 1933 1934
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
1935
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
1936 1937
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
1938
		bacpy(&rp->addr[i].bdaddr, &c->dst);
1939
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
1940
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
1941 1942 1943 1944
			continue;
		i++;
	}

1945
	rp->conn_count = cpu_to_le16(i);
1946

1947 1948
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
1949

1950
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
1951
			   rp_len);
1952

1953
	kfree(rp);
1954 1955

unlock:
1956
	hci_dev_unlock(hdev);
1957 1958 1959
	return err;
}

1960
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
1961
				   struct mgmt_cp_pin_code_neg_reply *cp)
1962 1963 1964 1965
{
	struct pending_cmd *cmd;
	int err;

1966
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
1967
			       sizeof(*cp));
1968 1969 1970
	if (!cmd)
		return -ENOMEM;

1971
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
1972
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
1973 1974 1975 1976 1977 1978
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

1979
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
1980
			  u16 len)
1981
{
1982
	struct hci_conn *conn;
1983
	struct mgmt_cp_pin_code_reply *cp = data;
1984
	struct hci_cp_pin_code_reply reply;
1985
	struct pending_cmd *cmd;
1986 1987 1988 1989
	int err;

	BT_DBG("");

1990
	hci_dev_lock(hdev);
1991

1992
	if (!hdev_is_powered(hdev)) {
1993
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
1994
				 MGMT_STATUS_NOT_POWERED);
1995 1996 1997
		goto failed;
	}

1998
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
1999
	if (!conn) {
2000
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2001
				 MGMT_STATUS_NOT_CONNECTED);
2002 2003 2004 2005
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2006 2007 2008
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2009 2010 2011

		BT_ERR("PIN code is not 16 bytes long");

2012
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2013
		if (err >= 0)
2014
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2015
					 MGMT_STATUS_INVALID_PARAMS);
2016 2017 2018 2019

		goto failed;
	}

2020
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2021 2022
	if (!cmd) {
		err = -ENOMEM;
2023
		goto failed;
2024
	}
2025

2026
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2027
	reply.pin_len = cp->pin_len;
2028
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2029 2030 2031

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2032
		mgmt_pending_remove(cmd);
2033 2034

failed:
2035
	hci_dev_unlock(hdev);
2036 2037 2038
	return err;
}

2039 2040
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2041
{
2042
	struct mgmt_cp_set_io_capability *cp = data;
2043 2044 2045

	BT_DBG("");

2046
	hci_dev_lock(hdev);
2047 2048 2049 2050

	hdev->io_capability = cp->io_capability;

	BT_DBG("%s IO capability set to 0x%02x", hdev->name,
2051
	       hdev->io_capability);
2052

2053
	hci_dev_unlock(hdev);
2054

2055 2056
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2057 2058
}

2059
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2060 2061
{
	struct hci_dev *hdev = conn->hdev;
2062
	struct pending_cmd *cmd;
2063

2064
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081
		if (cmd->opcode != MGMT_OP_PAIR_DEVICE)
			continue;

		if (cmd->user_data != conn)
			continue;

		return cmd;
	}

	return NULL;
}

static void pairing_complete(struct pending_cmd *cmd, u8 status)
{
	struct mgmt_rp_pair_device rp;
	struct hci_conn *conn = cmd->user_data;

2082
	bacpy(&rp.addr.bdaddr, &conn->dst);
2083
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2084

2085
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2086
		     &rp, sizeof(rp));
2087 2088 2089 2090 2091 2092 2093 2094

	/* So we don't get further callbacks for this connection */
	conn->connect_cfm_cb = NULL;
	conn->security_cfm_cb = NULL;
	conn->disconn_cfm_cb = NULL;

	hci_conn_put(conn);

2095
	mgmt_pending_remove(cmd);
2096 2097 2098 2099 2100 2101 2102 2103 2104
}

static void pairing_complete_cb(struct hci_conn *conn, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2105
	if (!cmd)
2106
		BT_DBG("Unable to find a pending command");
2107
	else
2108
		pairing_complete(cmd, mgmt_status(status));
2109 2110
}

2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126
static void le_connect_complete_cb(struct hci_conn *conn, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status %u", status);

	if (!status)
		return;

	cmd = find_pairing(conn);
	if (!cmd)
		BT_DBG("Unable to find a pending command");
	else
		pairing_complete(cmd, mgmt_status(status));
}

2127
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2128
		       u16 len)
2129
{
2130
	struct mgmt_cp_pair_device *cp = data;
2131
	struct mgmt_rp_pair_device rp;
2132 2133 2134 2135 2136 2137 2138
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2139 2140 2141 2142
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2143 2144 2145 2146 2147
	if (!bdaddr_type_is_valid(cp->addr.type))
		return cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

2148
	hci_dev_lock(hdev);
2149

2150
	if (!hdev_is_powered(hdev)) {
2151 2152
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2153 2154 2155
		goto unlock;
	}

2156 2157
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2158
		auth_type = HCI_AT_DEDICATED_BONDING;
2159
	else
2160 2161
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2162
	if (cp->addr.type == BDADDR_BREDR)
2163 2164
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2165
	else
2166 2167
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2168

2169
	if (IS_ERR(conn)) {
2170 2171 2172 2173 2174 2175 2176
		int status;

		if (PTR_ERR(conn) == -EBUSY)
			status = MGMT_STATUS_BUSY;
		else
			status = MGMT_STATUS_CONNECT_FAILED;

2177
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2178
				   status, &rp,
2179
				   sizeof(rp));
2180 2181 2182 2183 2184
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
		hci_conn_put(conn);
2185
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2186
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2187 2188 2189
		goto unlock;
	}

2190
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2191 2192 2193 2194 2195 2196
	if (!cmd) {
		err = -ENOMEM;
		hci_conn_put(conn);
		goto unlock;
	}

2197
	/* For LE, just connecting isn't a proof that the pairing finished */
2198
	if (cp->addr.type == BDADDR_BREDR)
2199
		conn->connect_cfm_cb = pairing_complete_cb;
2200 2201
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2202

2203 2204 2205 2206 2207 2208
	conn->security_cfm_cb = pairing_complete_cb;
	conn->disconn_cfm_cb = pairing_complete_cb;
	conn->io_capability = cp->io_cap;
	cmd->user_data = conn;

	if (conn->state == BT_CONNECTED &&
2209
	    hci_conn_security(conn, sec_level, auth_type))
2210 2211 2212 2213 2214
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2215
	hci_dev_unlock(hdev);
2216 2217 2218
	return err;
}

2219 2220
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2221
{
2222
	struct mgmt_addr_info *addr = data;
2223 2224 2225 2226 2227 2228 2229 2230
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2231
	if (!hdev_is_powered(hdev)) {
2232
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2233
				 MGMT_STATUS_NOT_POWERED);
2234 2235 2236
		goto unlock;
	}

2237 2238
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2239
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2240
				 MGMT_STATUS_INVALID_PARAMS);
2241 2242 2243 2244 2245 2246
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2247
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2248
				 MGMT_STATUS_INVALID_PARAMS);
2249 2250 2251 2252 2253
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2254
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2255
			   addr, sizeof(*addr));
2256 2257 2258 2259 2260
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2261
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2262 2263
			     bdaddr_t *bdaddr, u8 type, u16 mgmt_op,
			     u16 hci_op, __le32 passkey)
2264 2265
{
	struct pending_cmd *cmd;
2266
	struct hci_conn *conn;
2267 2268
	int err;

2269
	hci_dev_lock(hdev);
2270

2271
	if (!hdev_is_powered(hdev)) {
2272
		err = cmd_status(sk, hdev->id, mgmt_op,
2273
				 MGMT_STATUS_NOT_POWERED);
2274
		goto done;
2275 2276
	}

2277
	if (type == BDADDR_BREDR)
2278 2279
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, bdaddr);
	else
2280
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, bdaddr);
2281 2282

	if (!conn) {
2283
		err = cmd_status(sk, hdev->id, mgmt_op,
2284
				 MGMT_STATUS_NOT_CONNECTED);
2285 2286
		goto done;
	}
2287

2288
	if (type == BDADDR_LE_PUBLIC || type == BDADDR_LE_RANDOM) {
2289
		/* Continue with pairing via SMP */
2290 2291 2292
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2293
			err = cmd_status(sk, hdev->id, mgmt_op,
2294
					 MGMT_STATUS_SUCCESS);
2295
		else
2296
			err = cmd_status(sk, hdev->id, mgmt_op,
2297
					 MGMT_STATUS_FAILED);
2298 2299 2300 2301

		goto done;
	}

2302
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, bdaddr, sizeof(*bdaddr));
2303 2304
	if (!cmd) {
		err = -ENOMEM;
2305
		goto done;
2306 2307
	}

2308
	/* Continue with pairing via HCI */
2309 2310 2311 2312 2313 2314 2315 2316 2317
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

		bacpy(&cp.bdaddr, bdaddr);
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
		err = hci_send_cmd(hdev, hci_op, sizeof(*bdaddr), bdaddr);

2318 2319
	if (err < 0)
		mgmt_pending_remove(cmd);
2320

2321
done:
2322
	hci_dev_unlock(hdev);
2323 2324 2325
	return err;
}

2326 2327 2328 2329 2330 2331 2332 2333 2334 2335 2336 2337
static int pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_pin_code_neg_reply *cp = data;

	BT_DBG("");

	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2338 2339
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2340
{
2341
	struct mgmt_cp_user_confirm_reply *cp = data;
2342 2343 2344 2345

	BT_DBG("");

	if (len != sizeof(*cp))
2346
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2347
				  MGMT_STATUS_INVALID_PARAMS);
2348

2349
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2350 2351
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2352 2353
}

2354
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2355
				  void *data, u16 len)
2356
{
2357
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2358 2359 2360

	BT_DBG("");

2361
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2362 2363
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2364 2365
}

2366 2367
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2368
{
2369
	struct mgmt_cp_user_passkey_reply *cp = data;
2370 2371 2372

	BT_DBG("");

2373
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2374 2375
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2376 2377
}

2378
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2379
				  void *data, u16 len)
2380
{
2381
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2382 2383 2384

	BT_DBG("");

2385
	return user_pairing_resp(sk, hdev, &cp->addr.bdaddr, cp->addr.type,
2386 2387
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2388 2389
}

2390
static void update_name(struct hci_request *req)
2391
{
2392
	struct hci_dev *hdev = req->hdev;
2393 2394
	struct hci_cp_write_local_name cp;

2395
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2396

2397
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2398 2399
}

2400 2401 2402 2403 2404 2405 2406 2407 2408 2409 2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
static void set_name_complete(struct hci_dev *hdev, u8 status)
{
	struct mgmt_cp_set_local_name *cp;
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
	if (!cmd)
		goto unlock;

	cp = cmd->param;

	if (status)
		cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME,
			   mgmt_status(status));
	else
		cmd_complete(cmd->sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
			     cp, sizeof(*cp));

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2428
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2429
			  u16 len)
2430
{
2431
	struct mgmt_cp_set_local_name *cp = data;
2432
	struct pending_cmd *cmd;
2433
	struct hci_request req;
2434 2435 2436 2437
	int err;

	BT_DBG("");

2438
	hci_dev_lock(hdev);
2439

2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450
	/* If the old values are the same as the new ones just return a
	 * direct command complete event.
	 */
	if (!memcmp(hdev->dev_name, cp->name, sizeof(hdev->dev_name)) &&
	    !memcmp(hdev->short_name, cp->short_name,
		    sizeof(hdev->short_name))) {
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
				   data, len);
		goto failed;
	}

2451
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2452

2453
	if (!hdev_is_powered(hdev)) {
2454
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2455 2456

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2457
				   data, len);
2458 2459 2460 2461
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2462
				 sk);
2463

2464 2465 2466
		goto failed;
	}

2467
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2468 2469 2470 2471 2472
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2473 2474
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2475
	hci_req_init(&req, hdev);
2476 2477 2478 2479 2480 2481 2482 2483 2484

	if (lmp_bredr_capable(hdev)) {
		update_name(&req);
		update_eir(&req);
	}

	if (lmp_le_capable(hdev))
		hci_update_ad(&req);

2485
	err = hci_req_run(&req, set_name_complete);
2486 2487 2488 2489
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2490
	hci_dev_unlock(hdev);
2491 2492 2493
	return err;
}

2494
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2495
			       void *data, u16 data_len)
2496 2497 2498 2499
{
	struct pending_cmd *cmd;
	int err;

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

2502
	hci_dev_lock(hdev);
2503

2504
	if (!hdev_is_powered(hdev)) {
2505
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2506
				 MGMT_STATUS_NOT_POWERED);
2507 2508 2509
		goto unlock;
	}

2510
	if (!lmp_ssp_capable(hdev)) {
2511
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2512
				 MGMT_STATUS_NOT_SUPPORTED);
2513 2514 2515
		goto unlock;
	}

2516
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2517
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2518
				 MGMT_STATUS_BUSY);
2519 2520 2521
		goto unlock;
	}

2522
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2523 2524 2525 2526 2527 2528 2529 2530 2531 2532
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
	}

	err = hci_send_cmd(hdev, HCI_OP_READ_LOCAL_OOB_DATA, 0, NULL);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
2533
	hci_dev_unlock(hdev);
2534 2535 2536
	return err;
}

2537
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2538
			       void *data, u16 len)
2539
{
2540
	struct mgmt_cp_add_remote_oob_data *cp = data;
2541
	u8 status;
2542 2543
	int err;

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

2546
	hci_dev_lock(hdev);
2547

2548
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2549
				      cp->randomizer);
2550
	if (err < 0)
2551
		status = MGMT_STATUS_FAILED;
2552
	else
2553
		status = MGMT_STATUS_SUCCESS;
2554

2555
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2556
			   &cp->addr, sizeof(cp->addr));
2557

2558
	hci_dev_unlock(hdev);
2559 2560 2561
	return err;
}

2562
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2563
				  void *data, u16 len)
2564
{
2565
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2566
	u8 status;
2567 2568
	int err;

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

2571
	hci_dev_lock(hdev);
2572

2573
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2574
	if (err < 0)
2575
		status = MGMT_STATUS_INVALID_PARAMS;
2576
	else
2577
		status = MGMT_STATUS_SUCCESS;
2578

2579
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2580
			   status, &cp->addr, sizeof(cp->addr));
2581

2582
	hci_dev_unlock(hdev);
2583 2584 2585
	return err;
}

2586 2587 2588 2589 2590 2591 2592 2593 2594 2595 2596 2597 2598 2599 2600 2601 2602
int mgmt_interleaved_discovery(struct hci_dev *hdev)
{
	int err;

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

	hci_dev_lock(hdev);

	err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR_LE);
	if (err < 0)
		hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

	hci_dev_unlock(hdev);

	return err;
}

2603
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2604
			   void *data, u16 len)
2605
{
2606
	struct mgmt_cp_start_discovery *cp = data;
2607 2608 2609
	struct pending_cmd *cmd;
	int err;

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

2612
	hci_dev_lock(hdev);
2613

2614
	if (!hdev_is_powered(hdev)) {
2615
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2616
				 MGMT_STATUS_NOT_POWERED);
2617 2618 2619
		goto failed;
	}

2620 2621 2622 2623 2624 2625
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2626
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2627
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2628
				 MGMT_STATUS_BUSY);
2629 2630 2631
		goto failed;
	}

2632
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2633 2634 2635 2636 2637
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2638 2639 2640
	hdev->discovery.type = cp->type;

	switch (hdev->discovery.type) {
2641
	case DISCOV_TYPE_BREDR:
2642 2643 2644 2645 2646 2647 2648 2649
		if (!lmp_bredr_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_do_inquiry(hdev, INQUIRY_LEN_BREDR);
2650 2651 2652
		break;

	case DISCOV_TYPE_LE:
2653 2654 2655 2656 2657 2658 2659 2660 2661
		if (!lmp_host_le_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT,
				  LE_SCAN_WIN, LE_SCAN_TIMEOUT_LE_ONLY);
2662 2663
		break;

2664
	case DISCOV_TYPE_INTERLEAVED:
2665 2666 2667 2668 2669 2670 2671 2672 2673
		if (!lmp_host_le_capable(hdev) || !lmp_bredr_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		err = hci_le_scan(hdev, LE_SCAN_TYPE, LE_SCAN_INT, LE_SCAN_WIN,
				  LE_SCAN_TIMEOUT_BREDR_LE);
2674 2675
		break;

2676
	default:
2677 2678 2679 2680
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2681
	}
2682

2683 2684
	if (err < 0)
		mgmt_pending_remove(cmd);
2685 2686
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2687 2688

failed:
2689
	hci_dev_unlock(hdev);
2690 2691 2692
	return err;
}

2693
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2694
			  u16 len)
2695
{
2696
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2697
	struct pending_cmd *cmd;
2698 2699
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2700 2701
	int err;

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

2704
	hci_dev_lock(hdev);
2705

2706
	if (!hci_discovery_active(hdev)) {
2707
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2708 2709
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2710 2711 2712 2713
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
2714
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2715 2716
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2717
		goto unlock;
2718 2719
	}

2720
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2721 2722
	if (!cmd) {
		err = -ENOMEM;
2723 2724 2725
		goto unlock;
	}

2726 2727
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
2728 2729 2730 2731 2732
		if (test_bit(HCI_INQUIRY, &hdev->flags))
			err = hci_cancel_inquiry(hdev);
		else
			err = hci_cancel_le_scan(hdev);

2733 2734 2735 2736
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2737
						     NAME_PENDING);
2738
		if (!e) {
2739
			mgmt_pending_remove(cmd);
2740 2741 2742 2743 2744 2745 2746
			err = cmd_complete(sk, hdev->id,
					   MGMT_OP_STOP_DISCOVERY, 0,
					   &mgmt_cp->type,
					   sizeof(mgmt_cp->type));
			hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
			goto unlock;
		}
2747

2748 2749 2750 2751 2752 2753 2754 2755 2756
		bacpy(&cp.bdaddr, &e->data.bdaddr);
		err = hci_send_cmd(hdev, HCI_OP_REMOTE_NAME_REQ_CANCEL,
				   sizeof(cp), &cp);

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
		err = -EFAULT;
2757 2758 2759 2760
	}

	if (err < 0)
		mgmt_pending_remove(cmd);
2761 2762
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
2763

2764
unlock:
2765
	hci_dev_unlock(hdev);
2766 2767 2768
	return err;
}

2769
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
2770
			u16 len)
2771
{
2772
	struct mgmt_cp_confirm_name *cp = data;
2773 2774 2775
	struct inquiry_entry *e;
	int err;

2776
	BT_DBG("%s", hdev->name);
2777 2778 2779

	hci_dev_lock(hdev);

2780
	if (!hci_discovery_active(hdev)) {
2781
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2782
				 MGMT_STATUS_FAILED);
2783 2784 2785
		goto failed;
	}

2786
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
2787
	if (!e) {
2788
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
2789
				 MGMT_STATUS_INVALID_PARAMS);
2790 2791 2792 2793 2794 2795 2796 2797
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
2798
		hci_inquiry_cache_update_resolve(hdev, e);
2799 2800
	}

2801 2802
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
2803 2804 2805 2806 2807 2808

failed:
	hci_dev_unlock(hdev);
	return err;
}

2809
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
2810
			u16 len)
2811
{
2812
	struct mgmt_cp_block_device *cp = data;
2813
	u8 status;
2814 2815
	int err;

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

2818
	if (!bdaddr_type_is_valid(cp->addr.type))
2819 2820 2821
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
2822

2823
	hci_dev_lock(hdev);
2824

2825
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
2826
	if (err < 0)
2827
		status = MGMT_STATUS_FAILED;
2828
	else
2829
		status = MGMT_STATUS_SUCCESS;
2830

2831
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
2832
			   &cp->addr, sizeof(cp->addr));
2833

2834
	hci_dev_unlock(hdev);
2835 2836 2837 2838

	return err;
}

2839
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
2840
			  u16 len)
2841
{
2842
	struct mgmt_cp_unblock_device *cp = data;
2843
	u8 status;
2844 2845
	int err;

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

2848
	if (!bdaddr_type_is_valid(cp->addr.type))
2849 2850 2851
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
2852

2853
	hci_dev_lock(hdev);
2854

2855
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
2856
	if (err < 0)
2857
		status = MGMT_STATUS_INVALID_PARAMS;
2858
	else
2859
		status = MGMT_STATUS_SUCCESS;
2860

2861
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
2862
			   &cp->addr, sizeof(cp->addr));
2863

2864
	hci_dev_unlock(hdev);
2865 2866 2867 2868

	return err;
}

2869 2870 2871 2872
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
2873
	struct hci_request req;
2874
	int err;
2875
	__u16 source;
2876 2877 2878

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

2879 2880 2881 2882 2883 2884
	source = __le16_to_cpu(cp->source);

	if (source > 0x0002)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEVICE_ID,
				  MGMT_STATUS_INVALID_PARAMS);

2885 2886
	hci_dev_lock(hdev);

2887
	hdev->devid_source = source;
2888 2889 2890 2891 2892 2893
	hdev->devid_vendor = __le16_to_cpu(cp->vendor);
	hdev->devid_product = __le16_to_cpu(cp->product);
	hdev->devid_version = __le16_to_cpu(cp->version);

	err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEVICE_ID, 0, NULL, 0);

2894 2895 2896
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
2897 2898 2899 2900 2901 2902

	hci_dev_unlock(hdev);

	return err;
}

2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918
static void fast_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	cmd = mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev);
	if (!cmd)
		goto unlock;

	if (status) {
		cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
			   mgmt_status(status));
	} else {
2919 2920 2921 2922 2923 2924 2925
		struct mgmt_mode *cp = cmd->param;

		if (cp->val)
			set_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);
		else
			clear_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);

2926 2927 2928 2929 2930 2931 2932 2933 2934 2935
		send_settings_rsp(cmd->sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev);
		new_settings(hdev, cmd->sk);
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

2936
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
2937
				void *data, u16 len)
2938
{
2939
	struct mgmt_mode *cp = data;
2940
	struct hci_cp_write_page_scan_activity acp;
2941 2942
	struct pending_cmd *cmd;
	struct hci_request req;
2943 2944 2945
	u8 type;
	int err;

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

2948
	if (!lmp_bredr_capable(hdev) || hdev->hci_ver < BLUETOOTH_VER_1_2)
2949 2950 2951
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

2952 2953 2954 2955
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

2956
	if (!hdev_is_powered(hdev))
2957
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2958
				  MGMT_STATUS_NOT_POWERED);
2959 2960

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
2961
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
2962
				  MGMT_STATUS_REJECTED);
2963 2964 2965

	hci_dev_lock(hdev);

2966 2967 2968 2969 2970 2971
	if (mgmt_pending_find(MGMT_OP_SET_FAST_CONNECTABLE, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

2972 2973 2974 2975 2976 2977
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

2978
	if (cp->val) {
2979
		type = PAGE_SCAN_TYPE_INTERLACED;
2980

2981 2982
		/* 160 msec page scan interval */
		acp.interval = __constant_cpu_to_le16(0x0100);
2983 2984
	} else {
		type = PAGE_SCAN_TYPE_STANDARD;	/* default */
2985 2986 2987

		/* default 1.28 sec page scan */
		acp.interval = __constant_cpu_to_le16(0x0800);
2988 2989
	}

2990 2991
	/* default 11.25 msec page scan window */
	acp.window = __constant_cpu_to_le16(0x0012);
2992

2993 2994 2995 2996 2997
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
2998 2999
	}

3000 3001 3002 3003 3004 3005
	hci_req_init(&req, hdev);

	hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY, sizeof(acp), &acp);
	hci_req_add(&req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);

	err = hci_req_run(&req, fast_connectable_complete);
3006
	if (err < 0) {
3007
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3008
				 MGMT_STATUS_FAILED);
3009
		mgmt_pending_remove(cmd);
3010 3011
	}

3012
unlock:
3013
	hci_dev_unlock(hdev);
3014

3015 3016 3017
	return err;
}

3018 3019
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3020 3021
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3022 3023
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3024 3025
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3026 3027 3028
	return true;
}

3029
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3030
			       void *cp_data, u16 len)
3031 3032 3033
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3034
	int i, err;
3035

3036
	key_count = __le16_to_cpu(cp->key_count);
3037 3038 3039 3040 3041

	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_ltk_info);
	if (expected_len != len) {
		BT_ERR("load_keys: expected %u bytes, got %u bytes",
3042
		       len, expected_len);
3043
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3044
				  MGMT_STATUS_INVALID_PARAMS);
3045 3046
	}

3047
	BT_DBG("%s key_count %u", hdev->name, key_count);
3048

3049 3050 3051
	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];

3052
		if (!ltk_is_valid(key))
3053 3054 3055 3056 3057
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070
	hci_dev_lock(hdev);

	hci_smp_ltks_clear(hdev);

	for (i = 0; i < key_count; i++) {
		struct mgmt_ltk_info *key = &cp->keys[i];
		u8 type;

		if (key->master)
			type = HCI_SMP_LTK;
		else
			type = HCI_SMP_LTK_SLAVE;

3071
		hci_add_ltk(hdev, &key->addr.bdaddr,
3072
			    bdaddr_to_le(key->addr.type),
3073 3074
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3075 3076
	}

3077 3078 3079
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3080 3081
	hci_dev_unlock(hdev);

3082
	return err;
3083 3084
}

3085
static const struct mgmt_handler {
3086 3087
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3088 3089
	bool var_len;
	size_t data_len;
3090 3091
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3092 3093 3094 3095 3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118 3119 3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130
	{ read_version,           false, MGMT_READ_VERSION_SIZE },
	{ read_commands,          false, MGMT_READ_COMMANDS_SIZE },
	{ read_index_list,        false, MGMT_READ_INDEX_LIST_SIZE },
	{ read_controller_info,   false, MGMT_READ_INFO_SIZE },
	{ set_powered,            false, MGMT_SETTING_SIZE },
	{ set_discoverable,       false, MGMT_SET_DISCOVERABLE_SIZE },
	{ set_connectable,        false, MGMT_SETTING_SIZE },
	{ set_fast_connectable,   false, MGMT_SETTING_SIZE },
	{ set_pairable,           false, MGMT_SETTING_SIZE },
	{ set_link_security,      false, MGMT_SETTING_SIZE },
	{ set_ssp,                false, MGMT_SETTING_SIZE },
	{ set_hs,                 false, MGMT_SETTING_SIZE },
	{ set_le,                 false, MGMT_SETTING_SIZE },
	{ set_dev_class,          false, MGMT_SET_DEV_CLASS_SIZE },
	{ set_local_name,         false, MGMT_SET_LOCAL_NAME_SIZE },
	{ add_uuid,               false, MGMT_ADD_UUID_SIZE },
	{ remove_uuid,            false, MGMT_REMOVE_UUID_SIZE },
	{ load_link_keys,         true,  MGMT_LOAD_LINK_KEYS_SIZE },
	{ load_long_term_keys,    true,  MGMT_LOAD_LONG_TERM_KEYS_SIZE },
	{ disconnect,             false, MGMT_DISCONNECT_SIZE },
	{ get_connections,        false, MGMT_GET_CONNECTIONS_SIZE },
	{ pin_code_reply,         false, MGMT_PIN_CODE_REPLY_SIZE },
	{ pin_code_neg_reply,     false, MGMT_PIN_CODE_NEG_REPLY_SIZE },
	{ set_io_capability,      false, MGMT_SET_IO_CAPABILITY_SIZE },
	{ pair_device,            false, MGMT_PAIR_DEVICE_SIZE },
	{ cancel_pair_device,     false, MGMT_CANCEL_PAIR_DEVICE_SIZE },
	{ unpair_device,          false, MGMT_UNPAIR_DEVICE_SIZE },
	{ user_confirm_reply,     false, MGMT_USER_CONFIRM_REPLY_SIZE },
	{ user_confirm_neg_reply, false, MGMT_USER_CONFIRM_NEG_REPLY_SIZE },
	{ user_passkey_reply,     false, MGMT_USER_PASSKEY_REPLY_SIZE },
	{ user_passkey_neg_reply, false, MGMT_USER_PASSKEY_NEG_REPLY_SIZE },
	{ read_local_oob_data,    false, MGMT_READ_LOCAL_OOB_DATA_SIZE },
	{ add_remote_oob_data,    false, MGMT_ADD_REMOTE_OOB_DATA_SIZE },
	{ remove_remote_oob_data, false, MGMT_REMOVE_REMOTE_OOB_DATA_SIZE },
	{ start_discovery,        false, MGMT_START_DISCOVERY_SIZE },
	{ stop_discovery,         false, MGMT_STOP_DISCOVERY_SIZE },
	{ confirm_name,           false, MGMT_CONFIRM_NAME_SIZE },
	{ block_device,           false, MGMT_BLOCK_DEVICE_SIZE },
	{ unblock_device,         false, MGMT_UNBLOCK_DEVICE_SIZE },
3131
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3132 3133 3134
};


3135 3136
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3137 3138
	void *buf;
	u8 *cp;
3139
	struct mgmt_hdr *hdr;
3140
	u16 opcode, index, len;
3141
	struct hci_dev *hdev = NULL;
3142
	const struct mgmt_handler *handler;
3143 3144 3145 3146 3147 3148 3149
	int err;

	BT_DBG("got %zu bytes", msglen);

	if (msglen < sizeof(*hdr))
		return -EINVAL;

3150
	buf = kmalloc(msglen, GFP_KERNEL);
3151 3152 3153 3154 3155 3156 3157 3158
	if (!buf)
		return -ENOMEM;

	if (memcpy_fromiovec(buf, msg->msg_iov, msglen)) {
		err = -EFAULT;
		goto done;
	}

3159
	hdr = buf;
3160 3161 3162
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3163 3164 3165 3166 3167 3168

	if (len != msglen - sizeof(*hdr)) {
		err = -EINVAL;
		goto done;
	}

3169
	if (index != MGMT_INDEX_NONE) {
3170 3171 3172
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3173
					 MGMT_STATUS_INVALID_INDEX);
3174 3175 3176 3177
			goto done;
		}
	}

3178
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3179
	    mgmt_handlers[opcode].func == NULL) {
3180
		BT_DBG("Unknown op %u", opcode);
3181
		err = cmd_status(sk, index, opcode,
3182
				 MGMT_STATUS_UNKNOWN_COMMAND);
3183 3184 3185 3186
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3187
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3188
		err = cmd_status(sk, index, opcode,
3189
				 MGMT_STATUS_INVALID_INDEX);
3190
		goto done;
3191 3192
	}

3193 3194 3195
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3196
	    (!handler->var_len && len != handler->data_len)) {
3197
		err = cmd_status(sk, index, opcode,
3198
				 MGMT_STATUS_INVALID_PARAMS);
3199 3200 3201
		goto done;
	}

3202 3203 3204 3205 3206
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3207
	err = handler->func(sk, hdev, cp, len);
3208 3209 3210
	if (err < 0)
		goto done;

3211 3212 3213
	err = msglen;

done:
3214 3215 3216
	if (hdev)
		hci_dev_put(hdev);

3217 3218 3219
	kfree(buf);
	return err;
}
3220

3221 3222 3223 3224 3225 3226 3227 3228
static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
{
	u8 *status = data;

	cmd_status(cmd->sk, cmd->index, cmd->opcode, *status);
	mgmt_pending_remove(cmd);
}

3229
int mgmt_index_added(struct hci_dev *hdev)
3230
{
3231 3232 3233
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3234
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3235 3236
}

3237
int mgmt_index_removed(struct hci_dev *hdev)
3238
{
3239
	u8 status = MGMT_STATUS_INVALID_INDEX;
3240

3241 3242 3243
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3244
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3245

3246
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3247 3248
}

3249
struct cmd_lookup {
3250
	struct sock *sk;
3251
	struct hci_dev *hdev;
3252
	u8 mgmt_status;
3253 3254
};

3255
static void settings_rsp(struct pending_cmd *cmd, void *data)
3256
{
3257
	struct cmd_lookup *match = data;
3258

3259
	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);
3260 3261 3262 3263 3264 3265 3266 3267 3268

	list_del(&cmd->list);

	if (match->sk == NULL) {
		match->sk = cmd->sk;
		sock_hold(match->sk);
	}

	mgmt_pending_free(cmd);
3269
}
3270

3271
static void set_bredr_scan(struct hci_request *req)
3272
{
3273
	struct hci_dev *hdev = req->hdev;
3274 3275 3276 3277 3278 3279 3280
	u8 scan = 0;

	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3281 3282
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3283 3284
}

3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302
static void powered_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

	BT_DBG("status 0x%02x", status);

	hci_dev_lock(hdev);

	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);

	new_settings(hdev, match.sk);

	hci_dev_unlock(hdev);

	if (match.sk)
		sock_put(match.sk);
}

3303
static int powered_update_hci(struct hci_dev *hdev)
3304
{
3305
	struct hci_request req;
3306
	u8 link_sec;
3307

3308 3309
	hci_req_init(&req, hdev);

3310 3311 3312
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3313

3314
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3315
	}
3316

3317 3318
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
		struct hci_cp_write_le_host_supported cp;
3319

3320 3321
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3322

3323 3324 3325 3326 3327
		/* Check first if we already have the right
		 * host state (host features set)
		 */
		if (cp.le != lmp_host_le_capable(hdev) ||
		    cp.simul != lmp_host_le_br_capable(hdev))
3328 3329
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3330
	}
3331

3332 3333
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3334 3335
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3336

3337
	if (lmp_bredr_capable(hdev)) {
3338 3339
		set_bredr_scan(&req);
		update_class(&req);
3340
		update_name(&req);
3341
		update_eir(&req);
3342
	}
3343

3344
	return hci_req_run(&req, powered_complete);
3345
}
3346

3347 3348 3349
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3350 3351
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3352
	int err;
3353

3354 3355 3356 3357
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3358 3359
		if (powered_update_hci(hdev) == 0)
			return 0;
3360

3361 3362 3363
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3364 3365
	}

3366 3367 3368 3369 3370 3371 3372 3373
	mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp, &match);
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status_not_powered);

	if (memcmp(hdev->dev_class, zero_cod, sizeof(zero_cod)) != 0)
		mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev,
			   zero_cod, sizeof(zero_cod), NULL);

new_settings:
3374
	err = new_settings(hdev, match.sk);
3375 3376 3377 3378

	if (match.sk)
		sock_put(match.sk);

3379
	return err;
3380
}
3381

3382
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3383
{
3384
	struct cmd_lookup match = { NULL, hdev };
3385 3386
	bool changed = false;
	int err = 0;
3387

3388 3389 3390 3391 3392 3393 3394
	if (discoverable) {
		if (!test_and_set_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
			changed = true;
	}
3395

3396
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3397
			     &match);
3398

3399 3400
	if (changed)
		err = new_settings(hdev, match.sk);
3401

3402 3403 3404
	if (match.sk)
		sock_put(match.sk);

3405
	return err;
3406
}
3407

3408
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3409
{
3410
	struct pending_cmd *cmd;
3411 3412
	bool changed = false;
	int err = 0;
3413

3414 3415 3416 3417 3418 3419 3420
	if (connectable) {
		if (!test_and_set_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_CONNECTABLE, &hdev->dev_flags))
			changed = true;
	}
3421

3422
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
3423

3424
	if (changed)
3425
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
3426

3427
	return err;
3428
}
3429

3430
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3431
{
3432 3433
	u8 mgmt_err = mgmt_status(status);

3434
	if (scan & SCAN_PAGE)
3435
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3436
				     cmd_status_rsp, &mgmt_err);
3437 3438

	if (scan & SCAN_INQUIRY)
3439
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3440
				     cmd_status_rsp, &mgmt_err);
3441 3442 3443 3444

	return 0;
}

3445 3446
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
3447
{
3448
	struct mgmt_ev_new_link_key ev;
3449

3450
	memset(&ev, 0, sizeof(ev));
3451

3452
	ev.store_hint = persistent;
3453
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3454
	ev.key.addr.type = BDADDR_BREDR;
3455
	ev.key.type = key->type;
3456
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3457
	ev.key.pin_len = key->pin_len;
3458

3459
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3460
}
3461

3462 3463 3464 3465 3466 3467 3468 3469
int mgmt_new_ltk(struct hci_dev *hdev, struct smp_ltk *key, u8 persistent)
{
	struct mgmt_ev_new_long_term_key ev;

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

	ev.store_hint = persistent;
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3470
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3471 3472 3473 3474 3475 3476 3477 3478 3479 3480
	ev.key.authenticated = key->authenticated;
	ev.key.enc_size = key->enc_size;
	ev.key.ediv = key->ediv;

	if (key->type == HCI_SMP_LTK)
		ev.key.master = 1;

	memcpy(ev.key.rand, key->rand, sizeof(key->rand));
	memcpy(ev.key.val, key->val, sizeof(key->val));

3481 3482
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
3483 3484
}

3485
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3486 3487
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
3488
{
3489 3490 3491
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
3492

3493
	bacpy(&ev->addr.bdaddr, bdaddr);
3494
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3495

3496
	ev->flags = __cpu_to_le32(flags);
3497

3498 3499
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3500
					  name, name_len);
3501 3502

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3503
		eir_len = eir_append_data(ev->eir, eir_len,
3504
					  EIR_CLASS_OF_DEV, dev_class, 3);
3505

3506
	ev->eir_len = cpu_to_le16(eir_len);
3507 3508

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3509
			  sizeof(*ev) + eir_len, NULL);
3510 3511
}

3512 3513
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
3514
	struct mgmt_cp_disconnect *cp = cmd->param;
3515
	struct sock **sk = data;
3516
	struct mgmt_rp_disconnect rp;
3517

3518 3519
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3520

3521
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3522
		     sizeof(rp));
3523 3524 3525 3526

	*sk = cmd->sk;
	sock_hold(*sk);

3527
	mgmt_pending_remove(cmd);
3528 3529
}

3530
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3531
{
3532
	struct hci_dev *hdev = data;
3533 3534
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
3535 3536

	memset(&rp, 0, sizeof(rp));
3537 3538
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3539

3540 3541
	device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, cmd->sk);

3542
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3543 3544 3545 3546

	mgmt_pending_remove(cmd);
}

3547
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
3548
			     u8 link_type, u8 addr_type, u8 reason)
3549
{
3550
	struct mgmt_ev_device_disconnected ev;
3551 3552 3553
	struct sock *sk = NULL;
	int err;

3554
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
3555

3556 3557 3558
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
3559

3560
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3561
			 sk);
3562 3563

	if (sk)
3564
		sock_put(sk);
3565

3566
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3567
			     hdev);
3568

3569 3570 3571
	return err;
}

3572
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3573
			   u8 link_type, u8 addr_type, u8 status)
3574
{
3575
	struct mgmt_rp_disconnect rp;
3576 3577 3578
	struct pending_cmd *cmd;
	int err;

3579 3580 3581
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

3582
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3583 3584 3585
	if (!cmd)
		return -ENOENT;

3586
	bacpy(&rp.addr.bdaddr, bdaddr);
3587
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
3588

3589
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3590
			   mgmt_status(status), &rp, sizeof(rp));
3591

3592
	mgmt_pending_remove(cmd);
3593 3594

	return err;
3595
}
3596

3597
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3598
			u8 addr_type, u8 status)
3599 3600 3601
{
	struct mgmt_ev_connect_failed ev;

3602
	bacpy(&ev.addr.bdaddr, bdaddr);
3603
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3604
	ev.status = mgmt_status(status);
3605

3606
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3607
}
3608

3609
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3610 3611 3612
{
	struct mgmt_ev_pin_code_request ev;

3613
	bacpy(&ev.addr.bdaddr, bdaddr);
3614
	ev.addr.type = BDADDR_BREDR;
3615
	ev.secure = secure;
3616

3617
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3618
			  NULL);
3619 3620
}

3621
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3622
				 u8 status)
3623 3624
{
	struct pending_cmd *cmd;
3625
	struct mgmt_rp_pin_code_reply rp;
3626 3627
	int err;

3628
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3629 3630 3631
	if (!cmd)
		return -ENOENT;

3632
	bacpy(&rp.addr.bdaddr, bdaddr);
3633
	rp.addr.type = BDADDR_BREDR;
3634

3635
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3636
			   mgmt_status(status), &rp, sizeof(rp));
3637

3638
	mgmt_pending_remove(cmd);
3639 3640 3641 3642

	return err;
}

3643
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3644
				     u8 status)
3645 3646
{
	struct pending_cmd *cmd;
3647
	struct mgmt_rp_pin_code_reply rp;
3648 3649
	int err;

3650
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3651 3652 3653
	if (!cmd)
		return -ENOENT;

3654
	bacpy(&rp.addr.bdaddr, bdaddr);
3655
	rp.addr.type = BDADDR_BREDR;
3656

3657
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3658
			   mgmt_status(status), &rp, sizeof(rp));
3659

3660
	mgmt_pending_remove(cmd);
3661 3662 3663

	return err;
}
3664

3665
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3666 3667
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
3668 3669 3670
{
	struct mgmt_ev_user_confirm_request ev;

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

3673
	bacpy(&ev.addr.bdaddr, bdaddr);
3674
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3675
	ev.confirm_hint = confirm_hint;
3676
	ev.value = value;
3677

3678
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
3679
			  NULL);
3680 3681
}

3682
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3683
			      u8 link_type, u8 addr_type)
3684 3685 3686 3687 3688
{
	struct mgmt_ev_user_passkey_request ev;

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

3689
	bacpy(&ev.addr.bdaddr, bdaddr);
3690
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3691 3692

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
3693
			  NULL);
3694 3695
}

3696
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3697 3698
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
3699 3700 3701 3702 3703
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

3704
	cmd = mgmt_pending_find(opcode, hdev);
3705 3706 3707
	if (!cmd)
		return -ENOENT;

3708
	bacpy(&rp.addr.bdaddr, bdaddr);
3709
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
3710
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
3711
			   &rp, sizeof(rp));
3712

3713
	mgmt_pending_remove(cmd);
3714 3715 3716 3717

	return err;
}

3718
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3719
				     u8 link_type, u8 addr_type, u8 status)
3720
{
3721
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3722
					  status, MGMT_OP_USER_CONFIRM_REPLY);
3723 3724
}

3725
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3726
					 u8 link_type, u8 addr_type, u8 status)
3727
{
3728
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3729 3730
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
3731
}
3732

3733
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3734
				     u8 link_type, u8 addr_type, u8 status)
3735
{
3736
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3737
					  status, MGMT_OP_USER_PASSKEY_REPLY);
3738 3739
}

3740
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3741
					 u8 link_type, u8 addr_type, u8 status)
3742
{
3743
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
3744 3745
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
3746 3747
}

3748 3749 3750 3751 3752 3753 3754 3755 3756 3757 3758 3759 3760 3761 3762 3763
int mgmt_user_passkey_notify(struct hci_dev *hdev, bdaddr_t *bdaddr,
			     u8 link_type, u8 addr_type, u32 passkey,
			     u8 entered)
{
	struct mgmt_ev_passkey_notify ev;

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

	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.passkey = __cpu_to_le32(passkey);
	ev.entered = entered;

	return mgmt_event(MGMT_EV_PASSKEY_NOTIFY, hdev, &ev, sizeof(ev), NULL);
}

3764
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3765
		     u8 addr_type, u8 status)
3766 3767 3768
{
	struct mgmt_ev_auth_failed ev;

3769
	bacpy(&ev.addr.bdaddr, bdaddr);
3770
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3771
	ev.status = mgmt_status(status);
3772

3773
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
3774
}
3775

3776 3777 3778
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
3779 3780
	bool changed = false;
	int err = 0;
3781 3782 3783 3784

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
3785
				     cmd_status_rsp, &mgmt_err);
3786 3787 3788
		return 0;
	}

3789 3790 3791 3792 3793 3794 3795 3796
	if (test_bit(HCI_AUTH, &hdev->flags)) {
		if (!test_and_set_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
			changed = true;
	}

3797
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
3798
			     &match);
3799

3800 3801
	if (changed)
		err = new_settings(hdev, match.sk);
3802 3803 3804 3805 3806 3807 3808

	if (match.sk)
		sock_put(match.sk);

	return err;
}

3809
static void clear_eir(struct hci_request *req)
3810
{
3811
	struct hci_dev *hdev = req->hdev;
3812 3813
	struct hci_cp_write_eir cp;

3814
	if (!lmp_ext_inq_capable(hdev))
3815
		return;
3816

3817 3818
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

3821
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
3822 3823
}

3824
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
3825 3826
{
	struct cmd_lookup match = { NULL, hdev };
3827
	struct hci_request req;
3828 3829
	bool changed = false;
	int err = 0;
3830 3831 3832

	if (status) {
		u8 mgmt_err = mgmt_status(status);
3833 3834

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
3835
						 &hdev->dev_flags))
3836 3837
			err = new_settings(hdev, NULL);

3838 3839
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
3840 3841 3842 3843 3844 3845 3846 3847 3848 3849

		return err;
	}

	if (enable) {
		if (!test_and_set_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
			changed = true;
3850 3851 3852 3853
	}

	mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, settings_rsp, &match);

3854 3855
	if (changed)
		err = new_settings(hdev, match.sk);
3856

3857
	if (match.sk)
3858 3859
		sock_put(match.sk);

3860 3861
	hci_req_init(&req, hdev);

3862
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
3863
		update_eir(&req);
3864
	else
3865 3866 3867
		clear_eir(&req);

	hci_req_run(&req, NULL);
3868

3869 3870 3871
	return err;
}

3872
static void sk_lookup(struct pending_cmd *cmd, void *data)
3873 3874 3875 3876 3877 3878 3879 3880 3881
{
	struct cmd_lookup *match = data;

	if (match->sk == NULL) {
		match->sk = cmd->sk;
		sock_hold(match->sk);
	}
}

3882
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
3883
				   u8 status)
3884
{
3885 3886
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
3887

3888 3889 3890
	mgmt_pending_foreach(MGMT_OP_SET_DEV_CLASS, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_ADD_UUID, hdev, sk_lookup, &match);
	mgmt_pending_foreach(MGMT_OP_REMOVE_UUID, hdev, sk_lookup, &match);
3891 3892

	if (!status)
3893 3894
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
3895 3896 3897

	if (match.sk)
		sock_put(match.sk);
3898 3899 3900 3901

	return err;
}

3902
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
3903 3904
{
	struct mgmt_cp_set_local_name ev;
3905
	struct pending_cmd *cmd;
3906

3907 3908
	if (status)
		return 0;
3909 3910 3911

	memset(&ev, 0, sizeof(ev));
	memcpy(ev.name, name, HCI_MAX_NAME_LENGTH);
3912
	memcpy(ev.short_name, hdev->short_name, HCI_MAX_SHORT_NAME_LENGTH);
3913

3914
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
3915 3916
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
3917

3918 3919 3920 3921 3922
		/* If this is a HCI command related to powering on the
		 * HCI dev don't send any mgmt signals.
		 */
		if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev))
			return 0;
3923
	}
3924

3925 3926
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
3927
}
3928

3929
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
3930
					    u8 *randomizer, u8 status)
3931 3932 3933 3934
{
	struct pending_cmd *cmd;
	int err;

3935
	BT_DBG("%s status %u", hdev->name, status);
3936

3937
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
3938 3939 3940 3941
	if (!cmd)
		return -ENOENT;

	if (status) {
3942 3943
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
3944 3945 3946 3947 3948 3949
	} else {
		struct mgmt_rp_read_local_oob_data rp;

		memcpy(rp.hash, hash, sizeof(rp.hash));
		memcpy(rp.randomizer, randomizer, sizeof(rp.randomizer));

3950
		err = cmd_complete(cmd->sk, hdev->id,
3951 3952
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
3953 3954 3955 3956 3957 3958
	}

	mgmt_pending_remove(cmd);

	return err;
}
3959

3960 3961 3962 3963 3964 3965 3966 3967 3968 3969
int mgmt_le_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
	bool changed = false;
	int err = 0;

	if (status) {
		u8 mgmt_err = mgmt_status(status);

		if (enable && test_and_clear_bit(HCI_LE_ENABLED,
3970
						 &hdev->dev_flags))
3971
			err = new_settings(hdev, NULL);
3972

3973 3974
		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
3975 3976 3977 3978 3979 3980 3981 3982 3983 3984 3985 3986 3987 3988 3989 3990 3991 3992 3993 3994 3995 3996 3997

		return err;
	}

	if (enable) {
		if (!test_and_set_bit(HCI_LE_ENABLED, &hdev->dev_flags))
			changed = true;
	} else {
		if (test_and_clear_bit(HCI_LE_ENABLED, &hdev->dev_flags))
			changed = true;
	}

	mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, settings_rsp, &match);

	if (changed)
		err = new_settings(hdev, match.sk);

	if (match.sk)
		sock_put(match.sk);

	return err;
}

3998
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3999 4000
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
4001
{
4002 4003
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4004
	size_t ev_size;
4005

4006 4007
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4008 4009
		return -EINVAL;

4010 4011
	memset(buf, 0, sizeof(buf));

4012
	bacpy(&ev->addr.bdaddr, bdaddr);
4013
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4014
	ev->rssi = rssi;
4015
	if (cfm_name)
4016
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4017
	if (!ssp)
4018
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4019

4020
	if (eir_len > 0)
4021
		memcpy(ev->eir, eir, eir_len);
4022

4023 4024
	if (dev_class && !eir_has_data_type(ev->eir, eir_len, EIR_CLASS_OF_DEV))
		eir_len = eir_append_data(ev->eir, eir_len, EIR_CLASS_OF_DEV,
4025
					  dev_class, 3);
4026

4027
	ev->eir_len = cpu_to_le16(eir_len);
4028
	ev_size = sizeof(*ev) + eir_len;
4029

4030
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4031
}
4032

4033
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4034
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4035
{
4036 4037 4038
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4039

4040
	ev = (struct mgmt_ev_device_found *) buf;
4041

4042 4043 4044
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4045
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4046 4047 4048
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4049
				  name_len);
4050

4051
	ev->eir_len = cpu_to_le16(eir_len);
4052

4053
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
4054
			  sizeof(*ev) + eir_len, NULL);
4055
}
4056

4057
int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
4058 4059
{
	struct pending_cmd *cmd;
4060
	u8 type;
4061 4062
	int err;

4063 4064
	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

4065
	cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4066 4067 4068
	if (!cmd)
		return -ENOENT;

4069 4070 4071
	type = hdev->discovery.type;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
4072
			   &type, sizeof(type));
4073 4074 4075 4076 4077
	mgmt_pending_remove(cmd);

	return err;
}

4078 4079 4080 4081 4082 4083 4084 4085 4086
int mgmt_stop_discovery_failed(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	int err;

	cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
	if (!cmd)
		return -ENOENT;

4087
	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
4088
			   &hdev->discovery.type, sizeof(hdev->discovery.type));
4089 4090 4091 4092 4093
	mgmt_pending_remove(cmd);

	return err;
}

4094
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4095
{
4096
	struct mgmt_ev_discovering ev;
4097 4098
	struct pending_cmd *cmd;

4099 4100
	BT_DBG("%s discovering %u", hdev->name, discovering);

4101
	if (discovering)
4102
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4103
	else
4104
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4105 4106

	if (cmd != NULL) {
4107 4108
		u8 type = hdev->discovery.type;

4109 4110
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4111 4112 4113
		mgmt_pending_remove(cmd);
	}

4114 4115 4116 4117 4118
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4119
}
4120

4121
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4122 4123 4124 4125
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4126
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4127

4128 4129
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4130

4131
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4132
			  cmd ? cmd->sk : NULL);
4133 4134
}

4135
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4136 4137 4138 4139
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4140
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4141

4142 4143
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4144

4145
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4146
			  cmd ? cmd->sk : NULL);
4147
}
4148 4149 4150

module_param(enable_hs, bool, 0644);
MODULE_PARM_DESC(enable_hs, "Enable High Speed support");