mgmt.c 104.5 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
#define MGMT_VERSION	1
36
#define MGMT_REVISION	3
37

38 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
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,
76
	MGMT_OP_SET_DEVICE_ID,
77
	MGMT_OP_SET_ADVERTISING,
78
	MGMT_OP_SET_BREDR,
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
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
106

107 108 109
#define hdev_is_powered(hdev) (test_bit(HCI_UP, &hdev->flags) && \
				!test_bit(HCI_AUTO_OFF, &hdev->dev_flags))

110 111
struct pending_cmd {
	struct list_head list;
112
	u16 opcode;
113
	int index;
114
	void *param;
115
	struct sock *sk;
116
	void *user_data;
117 118
};

119 120 121 122 123 124 125 126 127 128 129 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
/* 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 */
};

184 185 186 187 188
bool mgmt_valid_hdev(struct hci_dev *hdev)
{
	return hdev->dev_type == HCI_BREDR;
}

189 190 191 192 193 194 195 196
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;
}

197
static int cmd_status(struct sock *sk, u16 index, u16 cmd, u8 status)
198 199 200 201
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_status *ev;
202
	int err;
203

204
	BT_DBG("sock %p, index %u, cmd %u, status %u", sk, index, cmd, status);
205

206
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev), GFP_KERNEL);
207 208 209 210 211
	if (!skb)
		return -ENOMEM;

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

212
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_STATUS);
213
	hdr->index = cpu_to_le16(index);
214 215 216 217
	hdr->len = cpu_to_le16(sizeof(*ev));

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

220 221
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
222 223
		kfree_skb(skb);

224
	return err;
225 226
}

227
static int cmd_complete(struct sock *sk, u16 index, u16 cmd, u8 status,
228
			void *rp, size_t rp_len)
229 230 231 232
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;
	struct mgmt_ev_cmd_complete *ev;
233
	int err;
234 235 236

	BT_DBG("sock %p", sk);

237
	skb = alloc_skb(sizeof(*hdr) + sizeof(*ev) + rp_len, GFP_KERNEL);
238 239 240 241 242
	if (!skb)
		return -ENOMEM;

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

243
	hdr->opcode = __constant_cpu_to_le16(MGMT_EV_CMD_COMPLETE);
244
	hdr->index = cpu_to_le16(index);
245
	hdr->len = cpu_to_le16(sizeof(*ev) + rp_len);
246

247
	ev = (void *) skb_put(skb, sizeof(*ev) + rp_len);
248
	ev->opcode = cpu_to_le16(cmd);
249
	ev->status = status;
250 251 252

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

254 255
	err = sock_queue_rcv_skb(sk, skb);
	if (err < 0)
256 257
		kfree_skb(skb);

258
	return err;
259 260
}

261 262
static int read_version(struct sock *sk, struct hci_dev *hdev, void *data,
			u16 data_len)
263 264 265 266 267 268
{
	struct mgmt_rp_read_version rp;

	BT_DBG("sock %p", sk);

	rp.version = MGMT_VERSION;
269
	rp.revision = __constant_cpu_to_le16(MGMT_REVISION);
270

271
	return cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_VERSION, 0, &rp,
272
			    sizeof(rp));
273 274
}

275 276
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
277 278
{
	struct mgmt_rp_read_commands *rp;
279 280
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
281
	__le16 *opcode;
282 283 284 285 286 287 288 289 290 291 292
	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;

293 294
	rp->num_commands = __constant_cpu_to_le16(num_commands);
	rp->num_events = __constant_cpu_to_le16(num_events);
295 296 297 298 299 300 301

	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);

302
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_COMMANDS, 0, rp,
303
			   rp_size);
304 305 306 307 308
	kfree(rp);

	return err;
}

309 310
static int read_index_list(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
311 312
{
	struct mgmt_rp_read_index_list *rp;
313
	struct hci_dev *d;
314
	size_t rp_len;
315
	u16 count;
316
	int err;
317 318 319 320 321 322

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

	count = 0;
323 324 325 326
	list_for_each_entry(d, &hci_dev_list, list) {
		if (!mgmt_valid_hdev(d))
			continue;

327 328 329
		count++;
	}

330 331 332
	rp_len = sizeof(*rp) + (2 * count);
	rp = kmalloc(rp_len, GFP_ATOMIC);
	if (!rp) {
333
		read_unlock(&hci_dev_list_lock);
334
		return -ENOMEM;
335
	}
336

337
	count = 0;
338
	list_for_each_entry(d, &hci_dev_list, list) {
339
		if (test_bit(HCI_SETUP, &d->dev_flags))
340 341
			continue;

342 343 344
		if (test_bit(HCI_USER_CHANNEL, &d->dev_flags))
			continue;

345 346 347
		if (!mgmt_valid_hdev(d))
			continue;

348
		rp->index[count++] = cpu_to_le16(d->id);
349 350 351
		BT_DBG("Added hci%u", d->id);
	}

352 353 354
	rp->num_controllers = cpu_to_le16(count);
	rp_len = sizeof(*rp) + (2 * count);

355 356
	read_unlock(&hci_dev_list_lock);

357
	err = cmd_complete(sk, MGMT_INDEX_NONE, MGMT_OP_READ_INDEX_LIST, 0, rp,
358
			   rp_len);
359

360 361 362
	kfree(rp);

	return err;
363 364
}

365 366 367 368 369 370 371
static u32 get_supported_settings(struct hci_dev *hdev)
{
	u32 settings = 0;

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

372
	if (lmp_ssp_capable(hdev))
373 374
		settings |= MGMT_SETTING_SSP;

375
	if (lmp_bredr_capable(hdev)) {
376
		settings |= MGMT_SETTING_CONNECTABLE;
377 378
		if (hdev->hci_ver >= BLUETOOTH_VER_1_2)
			settings |= MGMT_SETTING_FAST_CONNECTABLE;
379
		settings |= MGMT_SETTING_DISCOVERABLE;
380 381
		settings |= MGMT_SETTING_BREDR;
		settings |= MGMT_SETTING_LINK_SECURITY;
382
		settings |= MGMT_SETTING_HS;
383
	}
384

385
	if (lmp_le_capable(hdev)) {
386
		settings |= MGMT_SETTING_LE;
387 388
		settings |= MGMT_SETTING_ADVERTISING;
	}
389 390 391 392 393 394 395 396

	return settings;
}

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

397
	if (hdev_is_powered(hdev))
398 399
		settings |= MGMT_SETTING_POWERED;

400
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
401 402
		settings |= MGMT_SETTING_CONNECTABLE;

403 404 405
	if (test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
		settings |= MGMT_SETTING_FAST_CONNECTABLE;

406
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
407 408
		settings |= MGMT_SETTING_DISCOVERABLE;

409
	if (test_bit(HCI_PAIRABLE, &hdev->dev_flags))
410 411
		settings |= MGMT_SETTING_PAIRABLE;

412
	if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
413 414
		settings |= MGMT_SETTING_BREDR;

415
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
416 417
		settings |= MGMT_SETTING_LE;

418
	if (test_bit(HCI_LINK_SECURITY, &hdev->dev_flags))
419 420
		settings |= MGMT_SETTING_LINK_SECURITY;

421
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
422 423
		settings |= MGMT_SETTING_SSP;

424 425 426
	if (test_bit(HCI_HS_ENABLED, &hdev->dev_flags))
		settings |= MGMT_SETTING_HS;

427 428 429
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
		settings |= MGMT_SETTING_ADVERTISING;

430 431 432
	return settings;
}

433 434
#define PNP_INFO_SVCLASS_ID		0x1200

435 436 437 438 439 440 441 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
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;
}

477 478 479 480 481 482 483 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
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;
}

510 511 512 513 514 515 516 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
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;
}

543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
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);
	}

566
	if (hdev->inq_tx_power != HCI_TX_POWER_INVALID) {
567 568 569 570 571 572 573
		ptr[0] = 2;
		ptr[1] = EIR_TX_POWER;
		ptr[2] = (u8) hdev->inq_tx_power;

		ptr += 3;
	}

574 575 576 577 578 579 580 581 582 583 584 585
	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;
	}

586
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
587
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
588
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
589 590
}

591
static void update_eir(struct hci_request *req)
592
{
593
	struct hci_dev *hdev = req->hdev;
594 595
	struct hci_cp_write_eir cp;

596
	if (!hdev_is_powered(hdev))
597
		return;
598

599
	if (!lmp_ext_inq_capable(hdev))
600
		return;
601

602
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
603
		return;
604

605
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
606
		return;
607 608 609 610 611 612

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

	create_eir(hdev, cp.data);

	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
613
		return;
614 615 616

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

617
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
618 619 620 621 622 623 624 625 626 627 628 629 630
}

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;
}

631
static void update_class(struct hci_request *req)
632
{
633
	struct hci_dev *hdev = req->hdev;
634 635 636 637
	u8 cod[3];

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

638
	if (!hdev_is_powered(hdev))
639
		return;
640

641
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
642
		return;
643 644 645 646 647 648

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

	if (memcmp(cod, hdev->dev_class, 3) == 0)
649
		return;
650

651
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
652 653
}

654 655 656
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
657
					    service_cache.work);
658
	struct hci_request req;
659

660
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
661 662
		return;

663 664
	hci_req_init(&req, hdev);

665 666
	hci_dev_lock(hdev);

667 668
	update_eir(&req);
	update_class(&req);
669 670

	hci_dev_unlock(hdev);
671 672

	hci_req_run(&req, NULL);
673 674
}

675
static void mgmt_init_hdev(struct sock *sk, struct hci_dev *hdev)
676
{
677
	if (test_and_set_bit(HCI_MGMT, &hdev->dev_flags))
678 679
		return;

680
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
681

682 683 684 685 686 687
	/* 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);
688 689
}

690
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
691
				void *data, u16 data_len)
692
{
693
	struct mgmt_rp_read_info rp;
694

695
	BT_DBG("sock %p %s", sk, hdev->name);
696

697
	hci_dev_lock(hdev);
698

699 700
	memset(&rp, 0, sizeof(rp));

701
	bacpy(&rp.bdaddr, &hdev->bdaddr);
702

703
	rp.version = hdev->hci_ver;
704
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
705 706 707

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

709
	memcpy(rp.dev_class, hdev->dev_class, 3);
710

711
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
712
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
713

714
	hci_dev_unlock(hdev);
715

716
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
717
			    sizeof(rp));
718 719
}

720 721 722
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
723
	kfree(cmd->param);
724 725 726
	kfree(cmd);
}

727
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
728 729
					    struct hci_dev *hdev, void *data,
					    u16 len)
730 731 732
{
	struct pending_cmd *cmd;

733
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
734
	if (!cmd)
735
		return NULL;
736 737

	cmd->opcode = opcode;
738
	cmd->index = hdev->id;
739

740
	cmd->param = kmalloc(len, GFP_KERNEL);
741
	if (!cmd->param) {
742
		kfree(cmd);
743
		return NULL;
744 745
	}

746 747
	if (data)
		memcpy(cmd->param, data, len);
748 749 750 751

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

752
	list_add(&cmd->list, &hdev->mgmt_pending);
753

754
	return cmd;
755 756
}

757
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
758 759
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
760
				 void *data)
761
{
762
	struct pending_cmd *cmd, *tmp;
763

764
	list_for_each_entry_safe(cmd, tmp, &hdev->mgmt_pending, list) {
765
		if (opcode > 0 && cmd->opcode != opcode)
766 767 768 769 770 771
			continue;

		cb(cmd, data);
	}
}

772
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
773
{
774
	struct pending_cmd *cmd;
775

776
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
777 778
		if (cmd->opcode == opcode)
			return cmd;
779 780 781 782 783
	}

	return NULL;
}

784
static void mgmt_pending_remove(struct pending_cmd *cmd)
785 786 787 788 789
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

790
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
791
{
792
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
793

794
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
795
			    sizeof(settings));
796 797
}

798
static int set_powered(struct sock *sk, struct hci_dev *hdev, void *data,
799
		       u16 len)
800
{
801
	struct mgmt_mode *cp = data;
802
	struct pending_cmd *cmd;
803
	int err;
804

805
	BT_DBG("request for %s", hdev->name);
806

807 808 809 810
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

811
	hci_dev_lock(hdev);
812

813 814 815 816 817 818
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

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

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

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

835
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_POWERED, hdev, data, len);
836 837
	if (!cmd) {
		err = -ENOMEM;
838
		goto failed;
839
	}
840

841
	if (cp->val)
842
		queue_work(hdev->req_workqueue, &hdev->power_on);
843
	else
844
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
845

846
	err = 0;
847 848

failed:
849
	hci_dev_unlock(hdev);
850
	return err;
851 852
}

853 854
static int mgmt_event(u16 event, struct hci_dev *hdev, void *data, u16 data_len,
		      struct sock *skip_sk)
855 856 857 858
{
	struct sk_buff *skb;
	struct mgmt_hdr *hdr;

859
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
860 861 862 863 864 865 866 867
	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
868
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
869 870 871 872 873
	hdr->len = cpu_to_le16(data_len);

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

874 875 876
	/* Time stamp */
	__net_timestamp(skb);

877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
	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);
}

892 893 894 895 896 897 898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921
struct cmd_lookup {
	struct sock *sk;
	struct hci_dev *hdev;
	u8 mgmt_status;
};

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

	send_settings_rsp(cmd->sk, cmd->opcode, match->hdev);

	list_del(&cmd->list);

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

	mgmt_pending_free(cmd);
}

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);
}

922
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
923
			    u16 len)
924
{
925
	struct mgmt_cp_set_discoverable *cp = data;
926
	struct pending_cmd *cmd;
927
	u16 timeout;
928 929 930
	u8 scan;
	int err;

931
	BT_DBG("request for %s", hdev->name);
932

933
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
934 935 936
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				 MGMT_STATUS_NOT_SUPPORTED);

937 938 939 940
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

941
	timeout = __le16_to_cpu(cp->timeout);
942
	if (!cp->val && timeout > 0)
943
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
944
				  MGMT_STATUS_INVALID_PARAMS);
945

946
	hci_dev_lock(hdev);
947

948
	if (!hdev_is_powered(hdev) && timeout > 0) {
949
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
950
				 MGMT_STATUS_NOT_POWERED);
951 952 953
		goto failed;
	}

954
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
955
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
956
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
957
				 MGMT_STATUS_BUSY);
958 959 960
		goto failed;
	}

961
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
962
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
963
				 MGMT_STATUS_REJECTED);
964 965 966 967
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
968 969 970 971 972 973 974
		bool changed = false;

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

975
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
976 977 978 979 980 981
		if (err < 0)
			goto failed;

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

982 983 984 985
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
986 987 988 989 990 991 992 993 994 995 996
		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));
		}

997
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
998 999 1000
		goto failed;
	}

1001
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1002 1003
	if (!cmd) {
		err = -ENOMEM;
1004
		goto failed;
1005
	}
1006 1007 1008

	scan = SCAN_PAGE;

1009
	if (cp->val)
1010
		scan |= SCAN_INQUIRY;
1011
	else
1012
		cancel_delayed_work(&hdev->discov_off);
1013 1014 1015

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

1018
	if (cp->val)
1019
		hdev->discov_timeout = timeout;
1020

1021
failed:
1022
	hci_dev_unlock(hdev);
1023 1024 1025
	return err;
}

1026 1027
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1028
	struct hci_dev *hdev = req->hdev;
1029 1030 1031
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1032 1033 1034
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048
	if (enable) {
		type = PAGE_SCAN_TYPE_INTERLACED;

		/* 160 msec page scan interval */
		acp.interval = __constant_cpu_to_le16(0x0100);
	} else {
		type = PAGE_SCAN_TYPE_STANDARD;	/* default */

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

	acp.window = __constant_cpu_to_le16(0x0012);

1049 1050 1051 1052 1053 1054 1055
	if (__cpu_to_le16(hdev->page_scan_interval) != acp.interval ||
	    __cpu_to_le16(hdev->page_scan_window) != acp.window)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_ACTIVITY,
			    sizeof(acp), &acp);

	if (hdev->page_scan_type != type)
		hci_req_add(req, HCI_OP_WRITE_PAGE_SCAN_TYPE, 1, &type);
1056 1057
}

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
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);
}

1078
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1079
			   u16 len)
1080
{
1081
	struct mgmt_mode *cp = data;
1082
	struct pending_cmd *cmd;
1083
	struct hci_request req;
1084 1085 1086
	u8 scan;
	int err;

1087
	BT_DBG("request for %s", hdev->name);
1088

1089
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1090 1091 1092
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

1093 1094 1095 1096
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1097
	hci_dev_lock(hdev);
1098

1099
	if (!hdev_is_powered(hdev)) {
1100 1101 1102 1103 1104
		bool changed = false;

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

1105
		if (cp->val) {
1106
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1107
		} else {
1108 1109 1110
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1111

1112
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1113 1114 1115 1116 1117 1118
		if (err < 0)
			goto failed;

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

1119 1120 1121
		goto failed;
	}

1122
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1123
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1124
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1125
				 MGMT_STATUS_BUSY);
1126 1127 1128
		goto failed;
	}

1129
	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1130
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1131 1132 1133
		goto failed;
	}

1134
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1135 1136
	if (!cmd) {
		err = -ENOMEM;
1137
		goto failed;
1138
	}
1139

1140
	if (cp->val) {
1141
		scan = SCAN_PAGE;
1142
	} else {
1143 1144
		scan = 0;

1145
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1146
		    hdev->discov_timeout > 0)
1147 1148 1149
			cancel_delayed_work(&hdev->discov_off);
	}

1150 1151 1152 1153
	hci_req_init(&req, hdev);

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

1154 1155 1156 1157 1158 1159 1160
	/* If we're going from non-connectable to connectable or
	 * vice-versa when fast connectable is enabled ensure that fast
	 * connectable gets disabled. write_fast_connectable won't do
	 * anything if the page scan parameters are already what they
	 * should be.
	 */
	if (cp->val || test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags))
1161 1162
		write_fast_connectable(&req, false);

1163
	err = hci_req_run(&req, set_connectable_complete);
1164
	if (err < 0)
1165
		mgmt_pending_remove(cmd);
1166 1167

failed:
1168
	hci_dev_unlock(hdev);
1169 1170 1171
	return err;
}

1172
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1173
			u16 len)
1174
{
1175
	struct mgmt_mode *cp = data;
1176 1177
	int err;

1178
	BT_DBG("request for %s", hdev->name);
1179

1180 1181 1182 1183
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1184
	hci_dev_lock(hdev);
1185 1186

	if (cp->val)
1187
		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1188
	else
1189
		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1190

1191
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1192 1193 1194
	if (err < 0)
		goto failed;

1195
	err = new_settings(hdev, sk);
1196 1197

failed:
1198
	hci_dev_unlock(hdev);
1199 1200 1201
	return err;
}

1202 1203
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1204 1205 1206
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1207
	u8 val;
1208 1209
	int err;

1210
	BT_DBG("request for %s", hdev->name);
1211

1212
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1213 1214 1215
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_NOT_SUPPORTED);

1216 1217 1218 1219
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1220 1221
	hci_dev_lock(hdev);

1222
	if (!hdev_is_powered(hdev)) {
1223 1224 1225
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1226
					  &hdev->dev_flags)) {
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
			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);

1238 1239 1240 1241
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1242
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1243
				 MGMT_STATUS_BUSY);
1244 1245 1246 1247 1248 1249 1250 1251 1252 1253 1254 1255 1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266 1267 1268 1269 1270
		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;
}

1271
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1272 1273 1274
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1275
	u8 val;
1276 1277
	int err;

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

1280 1281 1282
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  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_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1288
	hci_dev_lock(hdev);
1289

1290 1291
	val = !!cp->val;

1292
	if (!hdev_is_powered(hdev)) {
1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306
		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);

1307 1308 1309 1310
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1311 1312
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1313 1314 1315 1316 1317 1318 1319 1320 1321 1322 1323 1324 1325 1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337
		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;
}

1338
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1339 1340
{
	struct mgmt_mode *cp = data;
1341 1342
	bool changed;
	int err;
1343

1344
	BT_DBG("request for %s", hdev->name);
1345

1346
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1347
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1348
				  MGMT_STATUS_NOT_SUPPORTED);
1349

1350 1351 1352 1353
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1354 1355
	hci_dev_lock(hdev);

1356
	if (cp->val) {
1357
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1358 1359 1360 1361 1362 1363 1364
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1365
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1366
	}
1367 1368 1369 1370 1371 1372 1373

	err = send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
	if (err < 0)
		goto unlock;

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

1375 1376 1377
unlock:
	hci_dev_unlock(hdev);
	return err;
1378 1379
}

1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392 1393 1394 1395 1396 1397 1398 1399
static void le_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

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

		mgmt_pending_foreach(MGMT_OP_SET_LE, hdev, cmd_status_rsp,
				     &mgmt_err);
		return;
	}

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

	new_settings(hdev, match.sk);

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

1400
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1401 1402 1403 1404
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1405
	struct hci_request req;
1406
	int err;
1407
	u8 val, enabled;
1408

1409
	BT_DBG("request for %s", hdev->name);
1410

1411 1412 1413
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1414

1415 1416 1417 1418
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1419
	/* LE-only devices do not allow toggling LE on/off */
1420
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1421 1422 1423
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1424
	hci_dev_lock(hdev);
1425 1426

	val = !!cp->val;
1427
	enabled = lmp_host_le_capable(hdev);
1428

1429
	if (!hdev_is_powered(hdev) || val == enabled) {
1430 1431 1432 1433 1434 1435 1436
		bool changed = false;

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

1437 1438 1439 1440 1441
		if (!val && test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
			clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
			changed = true;
		}

1442 1443
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1444
			goto unlock;
1445 1446 1447 1448

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

1449
		goto unlock;
1450 1451
	}

1452 1453
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1454
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1455
				 MGMT_STATUS_BUSY);
1456
		goto unlock;
1457 1458 1459 1460 1461
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1462
		goto unlock;
1463 1464 1465 1466 1467 1468
	}

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

	if (val) {
		hci_cp.le = val;
1469
		hci_cp.simul = lmp_le_br_capable(hdev);
1470 1471
	}

1472 1473
	hci_req_init(&req, hdev);

1474 1475 1476
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags) && !val)
		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

1477 1478 1479 1480
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1481
	if (err < 0)
1482 1483
		mgmt_pending_remove(cmd);

1484 1485
unlock:
	hci_dev_unlock(hdev);
1486 1487 1488
	return err;
}

1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511
/* 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;
}

1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530
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;
}

1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556
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);
}

1557
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1558
{
1559
	struct mgmt_cp_add_uuid *cp = data;
1560
	struct pending_cmd *cmd;
1561
	struct hci_request req;
1562 1563 1564
	struct bt_uuid *uuid;
	int err;

1565
	BT_DBG("request for %s", hdev->name);
1566

1567
	hci_dev_lock(hdev);
1568

1569
	if (pending_eir_or_class(hdev)) {
1570
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1571
				 MGMT_STATUS_BUSY);
1572 1573 1574
		goto failed;
	}

1575
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1576 1577 1578 1579 1580 1581
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1582
	uuid->svc_hint = cp->svc_hint;
1583
	uuid->size = get_uuid_size(cp->uuid);
1584

1585
	list_add_tail(&uuid->list, &hdev->uuids);
1586

1587
	hci_req_init(&req, hdev);
1588

1589 1590 1591
	update_class(&req);
	update_eir(&req);

1592 1593 1594 1595
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1596

1597
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1598
				   hdev->dev_class, 3);
1599 1600 1601 1602
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1603
	if (!cmd) {
1604
		err = -ENOMEM;
1605 1606 1607 1608
		goto failed;
	}

	err = 0;
1609 1610

failed:
1611
	hci_dev_unlock(hdev);
1612 1613 1614
	return err;
}

1615 1616 1617 1618 1619 1620
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)) {
1621 1622
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1623 1624 1625 1626 1627 1628
		return true;
	}

	return false;
}

1629 1630 1631 1632 1633 1634 1635
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);
}

1636
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1637
		       u16 len)
1638
{
1639
	struct mgmt_cp_remove_uuid *cp = data;
1640
	struct pending_cmd *cmd;
1641
	struct bt_uuid *match, *tmp;
1642
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1643
	struct hci_request req;
1644 1645
	int err, found;

1646
	BT_DBG("request for %s", hdev->name);
1647

1648
	hci_dev_lock(hdev);
1649

1650
	if (pending_eir_or_class(hdev)) {
1651
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1652
				 MGMT_STATUS_BUSY);
1653 1654 1655
		goto unlock;
	}

1656 1657
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1658

1659
		if (enable_service_cache(hdev)) {
1660
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1661
					   0, hdev->dev_class, 3);
1662 1663
			goto unlock;
		}
1664

1665
		goto update_class;
1666 1667 1668 1669
	}

	found = 0;

1670
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1671 1672 1673 1674
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1675
		kfree(match);
1676 1677 1678 1679
		found++;
	}

	if (found == 0) {
1680
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1681
				 MGMT_STATUS_INVALID_PARAMS);
1682 1683 1684
		goto unlock;
	}

1685
update_class:
1686
	hci_req_init(&req, hdev);
1687

1688 1689 1690
	update_class(&req);
	update_eir(&req);

1691 1692 1693 1694
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1695

1696
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1697
				   hdev->dev_class, 3);
1698 1699 1700 1701
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1702
	if (!cmd) {
1703
		err = -ENOMEM;
1704 1705 1706 1707
		goto unlock;
	}

	err = 0;
1708 1709

unlock:
1710
	hci_dev_unlock(hdev);
1711 1712 1713
	return err;
}

1714 1715 1716 1717 1718 1719 1720
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);
}

1721
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1722
			 u16 len)
1723
{
1724
	struct mgmt_cp_set_dev_class *cp = data;
1725
	struct pending_cmd *cmd;
1726
	struct hci_request req;
1727 1728
	int err;

1729
	BT_DBG("request for %s", hdev->name);
1730

1731
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1732 1733
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1734

1735
	hci_dev_lock(hdev);
1736

1737 1738 1739 1740 1741
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1742

1743 1744 1745 1746 1747
	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;
	}
1748

1749 1750 1751
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1752
	if (!hdev_is_powered(hdev)) {
1753
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1754
				   hdev->dev_class, 3);
1755 1756 1757
		goto unlock;
	}

1758 1759
	hci_req_init(&req, hdev);

1760
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1761 1762 1763
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1764
		update_eir(&req);
1765
	}
1766

1767 1768
	update_class(&req);

1769 1770 1771 1772
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1773

1774
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1775
				   hdev->dev_class, 3);
1776 1777 1778 1779
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1780
	if (!cmd) {
1781
		err = -ENOMEM;
1782 1783 1784 1785
		goto unlock;
	}

	err = 0;
1786

1787
unlock:
1788
	hci_dev_unlock(hdev);
1789 1790 1791
	return err;
}

1792
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1793
			  u16 len)
1794
{
1795
	struct mgmt_cp_load_link_keys *cp = data;
1796
	u16 key_count, expected_len;
1797
	int i;
1798

1799
	key_count = __le16_to_cpu(cp->key_count);
1800

1801 1802
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1803
	if (expected_len != len) {
1804
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1805
		       len, expected_len);
1806
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1807
				  MGMT_STATUS_INVALID_PARAMS);
1808 1809
	}

1810 1811 1812 1813
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1814
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1815
	       key_count);
1816

1817 1818 1819 1820 1821 1822 1823 1824
	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);
	}

1825
	hci_dev_lock(hdev);
1826 1827 1828 1829

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
1830
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1831
	else
1832
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1833

1834
	for (i = 0; i < key_count; i++) {
1835
		struct mgmt_link_key_info *key = &cp->keys[i];
1836

1837
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1838
				 key->type, key->pin_len);
1839 1840
	}

1841
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1842

1843
	hci_dev_unlock(hdev);
1844

1845
	return 0;
1846 1847
}

1848
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1849
			   u8 addr_type, struct sock *skip_sk)
1850 1851 1852 1853 1854 1855 1856
{
	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),
1857
			  skip_sk);
1858 1859
}

1860
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1861
			 u16 len)
1862
{
1863 1864
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1865 1866
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1867 1868 1869
	struct hci_conn *conn;
	int err;

1870
	memset(&rp, 0, sizeof(rp));
1871 1872
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1873

1874 1875 1876 1877 1878
	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));

1879 1880 1881 1882 1883
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1884 1885
	hci_dev_lock(hdev);

1886
	if (!hdev_is_powered(hdev)) {
1887
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1888
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1889 1890 1891
		goto unlock;
	}

1892
	if (cp->addr.type == BDADDR_BREDR)
1893 1894 1895
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1896

1897
	if (err < 0) {
1898
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1899
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1900 1901 1902
		goto unlock;
	}

1903
	if (cp->disconnect) {
1904
		if (cp->addr.type == BDADDR_BREDR)
1905
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1906
						       &cp->addr.bdaddr);
1907 1908
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1909
						       &cp->addr.bdaddr);
1910 1911 1912
	} else {
		conn = NULL;
	}
1913

1914
	if (!conn) {
1915
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1916
				   &rp, sizeof(rp));
1917
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1918 1919
		goto unlock;
	}
1920

1921
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1922
			       sizeof(*cp));
1923 1924 1925
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1926 1927
	}

1928
	dc.handle = cpu_to_le16(conn->handle);
1929 1930 1931 1932 1933
	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);

1934
unlock:
1935
	hci_dev_unlock(hdev);
1936 1937 1938
	return err;
}

1939
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1940
		      u16 len)
1941
{
1942
	struct mgmt_cp_disconnect *cp = data;
1943
	struct mgmt_rp_disconnect rp;
1944
	struct hci_cp_disconnect dc;
1945
	struct pending_cmd *cmd;
1946 1947 1948 1949 1950
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1951 1952 1953 1954
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1955
	if (!bdaddr_type_is_valid(cp->addr.type))
1956 1957 1958
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1959

1960
	hci_dev_lock(hdev);
1961 1962

	if (!test_bit(HCI_UP, &hdev->flags)) {
1963 1964
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1965 1966 1967
		goto failed;
	}

1968
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1969 1970
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1971 1972 1973
		goto failed;
	}

1974
	if (cp->addr.type == BDADDR_BREDR)
1975 1976
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
1977 1978
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1979

1980
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1981 1982
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1983 1984 1985
		goto failed;
	}

1986
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1987 1988
	if (!cmd) {
		err = -ENOMEM;
1989
		goto failed;
1990
	}
1991

1992
	dc.handle = cpu_to_le16(conn->handle);
1993
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1994 1995 1996

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
1997
		mgmt_pending_remove(cmd);
1998 1999

failed:
2000
	hci_dev_unlock(hdev);
2001 2002 2003
	return err;
}

2004
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2005 2006 2007
{
	switch (link_type) {
	case LE_LINK:
2008 2009
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2010
			return BDADDR_LE_PUBLIC;
2011

2012
		default:
2013
			/* Fallback to LE Random address type */
2014
			return BDADDR_LE_RANDOM;
2015
		}
2016

2017
	default:
2018
		/* Fallback to BR/EDR type */
2019
		return BDADDR_BREDR;
2020 2021 2022
	}
}

2023 2024
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2025 2026
{
	struct mgmt_rp_get_connections *rp;
2027
	struct hci_conn *c;
2028
	size_t rp_len;
2029 2030
	int err;
	u16 i;
2031 2032 2033

	BT_DBG("");

2034
	hci_dev_lock(hdev);
2035

2036
	if (!hdev_is_powered(hdev)) {
2037
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2038
				 MGMT_STATUS_NOT_POWERED);
2039 2040 2041
		goto unlock;
	}

2042
	i = 0;
2043 2044
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2045
			i++;
2046 2047
	}

2048
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2049
	rp = kmalloc(rp_len, GFP_KERNEL);
2050
	if (!rp) {
2051 2052 2053 2054 2055
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2056
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2057 2058
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2059
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2060
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2061
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2062 2063 2064 2065
			continue;
		i++;
	}

2066
	rp->conn_count = cpu_to_le16(i);
2067

2068 2069
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2070

2071
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2072
			   rp_len);
2073

2074
	kfree(rp);
2075 2076

unlock:
2077
	hci_dev_unlock(hdev);
2078 2079 2080
	return err;
}

2081
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2082
				   struct mgmt_cp_pin_code_neg_reply *cp)
2083 2084 2085 2086
{
	struct pending_cmd *cmd;
	int err;

2087
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2088
			       sizeof(*cp));
2089 2090 2091
	if (!cmd)
		return -ENOMEM;

2092
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2093
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2094 2095 2096 2097 2098 2099
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2100
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2101
			  u16 len)
2102
{
2103
	struct hci_conn *conn;
2104
	struct mgmt_cp_pin_code_reply *cp = data;
2105
	struct hci_cp_pin_code_reply reply;
2106
	struct pending_cmd *cmd;
2107 2108 2109 2110
	int err;

	BT_DBG("");

2111
	hci_dev_lock(hdev);
2112

2113
	if (!hdev_is_powered(hdev)) {
2114
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2115
				 MGMT_STATUS_NOT_POWERED);
2116 2117 2118
		goto failed;
	}

2119
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2120
	if (!conn) {
2121
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2122
				 MGMT_STATUS_NOT_CONNECTED);
2123 2124 2125 2126
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2127 2128 2129
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2130 2131 2132

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

2133
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2134
		if (err >= 0)
2135
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2136
					 MGMT_STATUS_INVALID_PARAMS);
2137 2138 2139 2140

		goto failed;
	}

2141
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2142 2143
	if (!cmd) {
		err = -ENOMEM;
2144
		goto failed;
2145
	}
2146

2147
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2148
	reply.pin_len = cp->pin_len;
2149
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2150 2151 2152

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2153
		mgmt_pending_remove(cmd);
2154 2155

failed:
2156
	hci_dev_unlock(hdev);
2157 2158 2159
	return err;
}

2160 2161
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2162
{
2163
	struct mgmt_cp_set_io_capability *cp = data;
2164 2165 2166

	BT_DBG("");

2167
	hci_dev_lock(hdev);
2168 2169 2170 2171

	hdev->io_capability = cp->io_capability;

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

2174
	hci_dev_unlock(hdev);
2175

2176 2177
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2178 2179
}

2180
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2181 2182
{
	struct hci_dev *hdev = conn->hdev;
2183
	struct pending_cmd *cmd;
2184

2185
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2186 2187 2188 2189 2190 2191 2192 2193 2194 2195 2196 2197 2198 2199 2200 2201 2202
		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;

2203
	bacpy(&rp.addr.bdaddr, &conn->dst);
2204
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2205

2206
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2207
		     &rp, sizeof(rp));
2208 2209 2210 2211 2212 2213

	/* 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;

2214
	hci_conn_drop(conn);
2215

2216
	mgmt_pending_remove(cmd);
2217 2218 2219 2220 2221 2222 2223 2224 2225
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2226
	if (!cmd)
2227
		BT_DBG("Unable to find a pending command");
2228
	else
2229
		pairing_complete(cmd, mgmt_status(status));
2230 2231
}

2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242 2243 2244 2245 2246 2247
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));
}

2248
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2249
		       u16 len)
2250
{
2251
	struct mgmt_cp_pair_device *cp = data;
2252
	struct mgmt_rp_pair_device rp;
2253 2254 2255 2256 2257 2258 2259
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2260 2261 2262 2263
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2264 2265 2266 2267 2268
	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));

2269
	hci_dev_lock(hdev);
2270

2271
	if (!hdev_is_powered(hdev)) {
2272 2273
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2274 2275 2276
		goto unlock;
	}

2277 2278
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2279
		auth_type = HCI_AT_DEDICATED_BONDING;
2280
	else
2281 2282
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2283
	if (cp->addr.type == BDADDR_BREDR)
2284 2285
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2286
	else
2287 2288
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2289

2290
	if (IS_ERR(conn)) {
2291 2292 2293 2294 2295 2296 2297
		int status;

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

2298
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2299
				   status, &rp,
2300
				   sizeof(rp));
2301 2302 2303 2304
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2305
		hci_conn_drop(conn);
2306
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2307
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2308 2309 2310
		goto unlock;
	}

2311
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2312 2313
	if (!cmd) {
		err = -ENOMEM;
2314
		hci_conn_drop(conn);
2315 2316 2317
		goto unlock;
	}

2318
	/* For LE, just connecting isn't a proof that the pairing finished */
2319
	if (cp->addr.type == BDADDR_BREDR)
2320
		conn->connect_cfm_cb = pairing_complete_cb;
2321 2322
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2323

2324 2325 2326 2327 2328 2329
	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 &&
2330
	    hci_conn_security(conn, sec_level, auth_type))
2331 2332 2333 2334 2335
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2336
	hci_dev_unlock(hdev);
2337 2338 2339
	return err;
}

2340 2341
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2342
{
2343
	struct mgmt_addr_info *addr = data;
2344 2345 2346 2347 2348 2349 2350 2351
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2352
	if (!hdev_is_powered(hdev)) {
2353
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2354
				 MGMT_STATUS_NOT_POWERED);
2355 2356 2357
		goto unlock;
	}

2358 2359
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2360
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2361
				 MGMT_STATUS_INVALID_PARAMS);
2362 2363 2364 2365 2366 2367
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2368
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2369
				 MGMT_STATUS_INVALID_PARAMS);
2370 2371 2372 2373 2374
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2375
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2376
			   addr, sizeof(*addr));
2377 2378 2379 2380 2381
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2382
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2383
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2384
			     u16 hci_op, __le32 passkey)
2385 2386
{
	struct pending_cmd *cmd;
2387
	struct hci_conn *conn;
2388 2389
	int err;

2390
	hci_dev_lock(hdev);
2391

2392
	if (!hdev_is_powered(hdev)) {
2393 2394 2395
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2396
		goto done;
2397 2398
	}

2399 2400
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2401
	else
2402
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2403 2404

	if (!conn) {
2405 2406 2407
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2408 2409
		goto done;
	}
2410

2411
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2412
		/* Continue with pairing via SMP */
2413 2414 2415
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2416 2417 2418
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2419
		else
2420 2421 2422
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2423 2424 2425 2426

		goto done;
	}

2427
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2428 2429
	if (!cmd) {
		err = -ENOMEM;
2430
		goto done;
2431 2432
	}

2433
	/* Continue with pairing via HCI */
2434 2435 2436
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2437
		bacpy(&cp.bdaddr, &addr->bdaddr);
2438 2439 2440
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2441 2442
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2443

2444 2445
	if (err < 0)
		mgmt_pending_remove(cmd);
2446

2447
done:
2448
	hci_dev_unlock(hdev);
2449 2450 2451
	return err;
}

2452 2453 2454 2455 2456 2457 2458
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("");

2459
	return user_pairing_resp(sk, hdev, &cp->addr,
2460 2461 2462 2463
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2464 2465
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2466
{
2467
	struct mgmt_cp_user_confirm_reply *cp = data;
2468 2469 2470 2471

	BT_DBG("");

	if (len != sizeof(*cp))
2472
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2473
				  MGMT_STATUS_INVALID_PARAMS);
2474

2475
	return user_pairing_resp(sk, hdev, &cp->addr,
2476 2477
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2478 2479
}

2480
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2481
				  void *data, u16 len)
2482
{
2483
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2484 2485 2486

	BT_DBG("");

2487
	return user_pairing_resp(sk, hdev, &cp->addr,
2488 2489
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2490 2491
}

2492 2493
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2494
{
2495
	struct mgmt_cp_user_passkey_reply *cp = data;
2496 2497 2498

	BT_DBG("");

2499
	return user_pairing_resp(sk, hdev, &cp->addr,
2500 2501
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2502 2503
}

2504
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2505
				  void *data, u16 len)
2506
{
2507
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2508 2509 2510

	BT_DBG("");

2511
	return user_pairing_resp(sk, hdev, &cp->addr,
2512 2513
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2514 2515
}

2516
static void update_name(struct hci_request *req)
2517
{
2518
	struct hci_dev *hdev = req->hdev;
2519 2520
	struct hci_cp_write_local_name cp;

2521
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2522

2523
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2524 2525
}

2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546 2547 2548 2549 2550 2551 2552 2553
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);
}

2554
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2555
			  u16 len)
2556
{
2557
	struct mgmt_cp_set_local_name *cp = data;
2558
	struct pending_cmd *cmd;
2559
	struct hci_request req;
2560 2561 2562 2563
	int err;

	BT_DBG("");

2564
	hci_dev_lock(hdev);
2565

2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576
	/* 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;
	}

2577
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2578

2579
	if (!hdev_is_powered(hdev)) {
2580
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2581 2582

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2583
				   data, len);
2584 2585 2586 2587
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2588
				 sk);
2589

2590 2591 2592
		goto failed;
	}

2593
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2594 2595 2596 2597 2598
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2599 2600
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2601
	hci_req_init(&req, hdev);
2602 2603 2604 2605 2606 2607 2608 2609 2610

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

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

2611
	err = hci_req_run(&req, set_name_complete);
2612 2613 2614 2615
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2616
	hci_dev_unlock(hdev);
2617 2618 2619
	return err;
}

2620
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2621
			       void *data, u16 data_len)
2622 2623 2624 2625
{
	struct pending_cmd *cmd;
	int err;

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

2628
	hci_dev_lock(hdev);
2629

2630
	if (!hdev_is_powered(hdev)) {
2631
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2632
				 MGMT_STATUS_NOT_POWERED);
2633 2634 2635
		goto unlock;
	}

2636
	if (!lmp_ssp_capable(hdev)) {
2637
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2638
				 MGMT_STATUS_NOT_SUPPORTED);
2639 2640 2641
		goto unlock;
	}

2642
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2643
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2644
				 MGMT_STATUS_BUSY);
2645 2646 2647
		goto unlock;
	}

2648
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2649 2650 2651 2652 2653 2654 2655 2656 2657 2658
	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:
2659
	hci_dev_unlock(hdev);
2660 2661 2662
	return err;
}

2663
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2664
			       void *data, u16 len)
2665
{
2666
	struct mgmt_cp_add_remote_oob_data *cp = data;
2667
	u8 status;
2668 2669
	int err;

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

2672
	hci_dev_lock(hdev);
2673

2674
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2675
				      cp->randomizer);
2676
	if (err < 0)
2677
		status = MGMT_STATUS_FAILED;
2678
	else
2679
		status = MGMT_STATUS_SUCCESS;
2680

2681
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2682
			   &cp->addr, sizeof(cp->addr));
2683

2684
	hci_dev_unlock(hdev);
2685 2686 2687
	return err;
}

2688
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2689
				  void *data, u16 len)
2690
{
2691
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2692
	u8 status;
2693 2694
	int err;

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

2697
	hci_dev_lock(hdev);
2698

2699
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2700
	if (err < 0)
2701
		status = MGMT_STATUS_INVALID_PARAMS;
2702
	else
2703
		status = MGMT_STATUS_SUCCESS;
2704

2705
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2706
			   status, &cp->addr, sizeof(cp->addr));
2707

2708
	hci_dev_unlock(hdev);
2709 2710 2711
	return err;
}

2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732
static int mgmt_start_discovery_failed(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;
	u8 type;
	int err;

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

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

	type = hdev->discovery.type;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
			   &type, sizeof(type));
	mgmt_pending_remove(cmd);

	return err;
}

2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743 2744 2745 2746 2747 2748 2749 2750
static void start_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

	if (status) {
		hci_dev_lock(hdev);
		mgmt_start_discovery_failed(hdev, status);
		hci_dev_unlock(hdev);
		return;
	}

	hci_dev_lock(hdev);
	hci_discovery_set_state(hdev, DISCOVERY_FINDING);
	hci_dev_unlock(hdev);

	switch (hdev->discovery.type) {
	case DISCOV_TYPE_LE:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2751
				   DISCOV_LE_TIMEOUT);
2752 2753 2754 2755
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2756
				   DISCOV_INTERLEAVED_TIMEOUT);
2757 2758 2759 2760 2761 2762 2763 2764 2765 2766
		break;

	case DISCOV_TYPE_BREDR:
		break;

	default:
		BT_ERR("Invalid discovery type %d", hdev->discovery.type);
	}
}

2767
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2768
			   void *data, u16 len)
2769
{
2770
	struct mgmt_cp_start_discovery *cp = data;
2771
	struct pending_cmd *cmd;
2772 2773 2774 2775 2776 2777
	struct hci_cp_le_set_scan_param param_cp;
	struct hci_cp_le_set_scan_enable enable_cp;
	struct hci_cp_inquiry inq_cp;
	struct hci_request req;
	/* General inquiry access code (GIAC) */
	u8 lap[3] = { 0x33, 0x8b, 0x9e };
2778 2779
	int err;

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

2782
	hci_dev_lock(hdev);
2783

2784
	if (!hdev_is_powered(hdev)) {
2785
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2786
				 MGMT_STATUS_NOT_POWERED);
2787 2788 2789
		goto failed;
	}

2790 2791 2792 2793 2794 2795
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2796
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2797
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2798
				 MGMT_STATUS_BUSY);
2799 2800 2801
		goto failed;
	}

2802
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2803 2804 2805 2806 2807
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2808 2809
	hdev->discovery.type = cp->type;

2810 2811
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
2812
	switch (hdev->discovery.type) {
2813
	case DISCOV_TYPE_BREDR:
2814
		if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2815 2816 2817 2818 2819 2820
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2821 2822 2823 2824 2825 2826 2827 2828 2829 2830 2831
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_BUSY);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		hci_inquiry_cache_flush(hdev);

		memset(&inq_cp, 0, sizeof(inq_cp));
		memcpy(&inq_cp.lap, lap, sizeof(inq_cp.lap));
2832
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
2833
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
2834 2835 2836
		break;

	case DISCOV_TYPE_LE:
2837
	case DISCOV_TYPE_INTERLEAVED:
2838
		if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
2839 2840 2841 2842 2843 2844
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2845
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
2846
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2847 2848 2849 2850 2851 2852
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2853 2854 2855 2856 2857 2858 2859 2860 2861 2862 2863 2864 2865 2866 2867 2868
		if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_REJECTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		if (test_bit(HCI_LE_SCAN, &hdev->dev_flags)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_BUSY);
			mgmt_pending_remove(cmd);
			goto failed;
		}

		memset(&param_cp, 0, sizeof(param_cp));
		param_cp.type = LE_SCAN_ACTIVE;
2869 2870
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
2871 2872 2873 2874 2875 2876 2877 2878
		hci_req_add(&req, HCI_OP_LE_SET_SCAN_PARAM, sizeof(param_cp),
			    &param_cp);

		memset(&enable_cp, 0, sizeof(enable_cp));
		enable_cp.enable = LE_SCAN_ENABLE;
		enable_cp.filter_dup = LE_SCAN_FILTER_DUP_ENABLE;
		hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE, sizeof(enable_cp),
			    &enable_cp);
2879 2880
		break;

2881
	default:
2882 2883 2884 2885
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2886
	}
2887

2888
	err = hci_req_run(&req, start_discovery_complete);
2889 2890
	if (err < 0)
		mgmt_pending_remove(cmd);
2891 2892
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2893 2894

failed:
2895
	hci_dev_unlock(hdev);
2896 2897 2898
	return err;
}

2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911 2912 2913 2914
static 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;

	err = cmd_complete(cmd->sk, hdev->id, cmd->opcode, mgmt_status(status),
			   &hdev->discovery.type, sizeof(hdev->discovery.type));
	mgmt_pending_remove(cmd);

	return err;
}

2915 2916 2917 2918 2919 2920 2921 2922 2923 2924 2925 2926 2927 2928 2929 2930 2931
static void stop_discovery_complete(struct hci_dev *hdev, u8 status)
{
	BT_DBG("status %d", status);

	hci_dev_lock(hdev);

	if (status) {
		mgmt_stop_discovery_failed(hdev, status);
		goto unlock;
	}

	hci_discovery_set_state(hdev, DISCOVERY_STOPPED);

unlock:
	hci_dev_unlock(hdev);
}

2932
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2933
			  u16 len)
2934
{
2935
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2936
	struct pending_cmd *cmd;
2937 2938
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2939 2940
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
2941 2942
	int err;

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

2945
	hci_dev_lock(hdev);
2946

2947
	if (!hci_discovery_active(hdev)) {
2948
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2949 2950
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2951 2952 2953 2954
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
2955
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2956 2957
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2958
		goto unlock;
2959 2960
	}

2961
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2962 2963
	if (!cmd) {
		err = -ENOMEM;
2964 2965 2966
		goto unlock;
	}

2967 2968
	hci_req_init(&req, hdev);

2969 2970
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
2971 2972 2973 2974 2975 2976 2977 2978 2979 2980
		if (test_bit(HCI_INQUIRY, &hdev->flags)) {
			hci_req_add(&req, HCI_OP_INQUIRY_CANCEL, 0, NULL);
		} else {
			cancel_delayed_work(&hdev->le_scan_disable);

			memset(&enable_cp, 0, sizeof(enable_cp));
			enable_cp.enable = LE_SCAN_DISABLE;
			hci_req_add(&req, HCI_OP_LE_SET_SCAN_ENABLE,
				    sizeof(enable_cp), &enable_cp);
		}
2981

2982 2983 2984 2985
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2986
						     NAME_PENDING);
2987
		if (!e) {
2988
			mgmt_pending_remove(cmd);
2989 2990 2991 2992 2993 2994 2995
			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;
		}
2996

2997
		bacpy(&cp.bdaddr, &e->data.bdaddr);
2998 2999
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3000 3001 3002 3003 3004

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3005 3006 3007 3008 3009 3010

		mgmt_pending_remove(cmd);
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
				   MGMT_STATUS_FAILED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
		goto unlock;
3011 3012
	}

3013
	err = hci_req_run(&req, stop_discovery_complete);
3014 3015
	if (err < 0)
		mgmt_pending_remove(cmd);
3016 3017
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3018

3019
unlock:
3020
	hci_dev_unlock(hdev);
3021 3022 3023
	return err;
}

3024
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3025
			u16 len)
3026
{
3027
	struct mgmt_cp_confirm_name *cp = data;
3028 3029 3030
	struct inquiry_entry *e;
	int err;

3031
	BT_DBG("%s", hdev->name);
3032 3033 3034

	hci_dev_lock(hdev);

3035
	if (!hci_discovery_active(hdev)) {
3036
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3037
				 MGMT_STATUS_FAILED);
3038 3039 3040
		goto failed;
	}

3041
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3042
	if (!e) {
3043
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3044
				 MGMT_STATUS_INVALID_PARAMS);
3045 3046 3047 3048 3049 3050 3051 3052
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3053
		hci_inquiry_cache_update_resolve(hdev, e);
3054 3055
	}

3056 3057
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3058 3059 3060 3061 3062 3063

failed:
	hci_dev_unlock(hdev);
	return err;
}

3064
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3065
			u16 len)
3066
{
3067
	struct mgmt_cp_block_device *cp = data;
3068
	u8 status;
3069 3070
	int err;

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

3073
	if (!bdaddr_type_is_valid(cp->addr.type))
3074 3075 3076
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3077

3078
	hci_dev_lock(hdev);
3079

3080
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3081
	if (err < 0)
3082
		status = MGMT_STATUS_FAILED;
3083
	else
3084
		status = MGMT_STATUS_SUCCESS;
3085

3086
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3087
			   &cp->addr, sizeof(cp->addr));
3088

3089
	hci_dev_unlock(hdev);
3090 3091 3092 3093

	return err;
}

3094
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3095
			  u16 len)
3096
{
3097
	struct mgmt_cp_unblock_device *cp = data;
3098
	u8 status;
3099 3100
	int err;

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

3103
	if (!bdaddr_type_is_valid(cp->addr.type))
3104 3105 3106
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3107

3108
	hci_dev_lock(hdev);
3109

3110
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3111
	if (err < 0)
3112
		status = MGMT_STATUS_INVALID_PARAMS;
3113
	else
3114
		status = MGMT_STATUS_SUCCESS;
3115

3116
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3117
			   &cp->addr, sizeof(cp->addr));
3118

3119
	hci_dev_unlock(hdev);
3120 3121 3122 3123

	return err;
}

3124 3125 3126 3127
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3128
	struct hci_request req;
3129
	int err;
3130
	__u16 source;
3131 3132 3133

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

3134 3135 3136 3137 3138 3139
	source = __le16_to_cpu(cp->source);

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

3140 3141
	hci_dev_lock(hdev);

3142
	hdev->devid_source = source;
3143 3144 3145 3146 3147 3148
	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);

3149 3150 3151
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3152 3153 3154 3155 3156 3157

	hci_dev_unlock(hdev);

	return err;
}

3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169 3170 3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221 3222 3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249
static void set_advertising_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };

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

		mgmt_pending_foreach(MGMT_OP_SET_ADVERTISING, hdev,
				     cmd_status_rsp, &mgmt_err);
		return;
	}

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

	new_settings(hdev, match.sk);

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

static int set_advertising(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
	u8 val, enabled;
	int err;

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

	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				  MGMT_STATUS_NOT_SUPPORTED);

	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				  MGMT_STATUS_REJECTED);

	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

	val = !!cp->val;
	enabled = test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);

	if (!hdev_is_powered(hdev) || val == enabled) {
		bool changed = false;

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

		err = send_settings_rsp(sk, MGMT_OP_SET_ADVERTISING, hdev);
		if (err < 0)
			goto unlock;

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

		goto unlock;
	}

	if (mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_LE, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

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

	hci_req_init(&req, hdev);

	hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

	err = hci_req_run(&req, set_advertising_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265
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 {
3266 3267 3268 3269 3270 3271 3272
		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);

3273 3274 3275 3276 3277 3278 3279 3280 3281 3282
		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);
}

3283
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3284
				void *data, u16 len)
3285
{
3286
	struct mgmt_mode *cp = data;
3287 3288
	struct pending_cmd *cmd;
	struct hci_request req;
3289 3290
	int err;

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

3293 3294
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3295 3296 3297
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3298 3299 3300 3301
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3302
	if (!hdev_is_powered(hdev))
3303
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3304
				  MGMT_STATUS_NOT_POWERED);
3305 3306

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3307
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3308
				  MGMT_STATUS_REJECTED);
3309 3310 3311

	hci_dev_lock(hdev);

3312 3313 3314 3315 3316 3317
	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;
	}

3318 3319 3320 3321 3322 3323
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3324 3325 3326 3327 3328
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3329 3330
	}

3331 3332
	hci_req_init(&req, hdev);

3333
	write_fast_connectable(&req, cp->val);
3334 3335

	err = hci_req_run(&req, fast_connectable_complete);
3336
	if (err < 0) {
3337
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3338
				 MGMT_STATUS_FAILED);
3339
		mgmt_pending_remove(cmd);
3340 3341
	}

3342
unlock:
3343
	hci_dev_unlock(hdev);
3344

3345 3346 3347
	return err;
}

3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462
static void set_bredr_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_BREDR, hdev);
	if (!cmd)
		goto unlock;

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

		/* We need to restore the flag if related HCI commands
		 * failed.
		 */
		clear_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

		cmd_status(cmd->sk, cmd->index, cmd->opcode, mgmt_err);
	} else {
		send_settings_rsp(cmd->sk, MGMT_OP_SET_BREDR, hdev);
		new_settings(hdev, cmd->sk);
	}

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

static int set_bredr(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
	struct hci_request req;
	int err;

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

	if (!lmp_bredr_capable(hdev) || !lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_NOT_SUPPORTED);

	if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_REJECTED);

	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				  MGMT_STATUS_INVALID_PARAMS);

	hci_dev_lock(hdev);

	if (cp->val == test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		goto unlock;
	}

	if (!hdev_is_powered(hdev)) {
		if (!cp->val) {
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
			clear_bit(HCI_SSP_ENABLED, &hdev->dev_flags);
			clear_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
			clear_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
		}

		change_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

		err = send_settings_rsp(sk, MGMT_OP_SET_BREDR, hdev);
		if (err < 0)
			goto unlock;

		err = new_settings(hdev, sk);
		goto unlock;
	}

	/* Reject disabling when powered on */
	if (!cp->val) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				 MGMT_STATUS_REJECTED);
		goto unlock;
	}

	if (mgmt_pending_find(MGMT_OP_SET_BREDR, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_BREDR,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}

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

	/* We need to flip the bit already here so that hci_update_ad
	 * generates the correct flags.
	 */
	set_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

	hci_req_init(&req, hdev);
	hci_update_ad(&req);
	err = hci_req_run(&req, set_bredr_complete);
	if (err < 0)
		mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3463 3464
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3465 3466
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3467 3468
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3469 3470
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3471 3472 3473
	return true;
}

3474
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3475
			       void *cp_data, u16 len)
3476 3477 3478
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3479
	int i, err;
3480

3481
	key_count = __le16_to_cpu(cp->key_count);
3482 3483 3484 3485 3486

	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",
3487
		       len, expected_len);
3488
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3489
				  MGMT_STATUS_INVALID_PARAMS);
3490 3491
	}

3492
	BT_DBG("%s key_count %u", hdev->name, key_count);
3493

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

3497
		if (!ltk_is_valid(key))
3498 3499 3500 3501 3502
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515
	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;

3516
		hci_add_ltk(hdev, &key->addr.bdaddr,
3517
			    bdaddr_to_le(key->addr.type),
3518 3519
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3520 3521
	}

3522 3523 3524
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3525 3526
	hci_dev_unlock(hdev);

3527
	return err;
3528 3529
}

3530
static const struct mgmt_handler {
3531 3532
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3533 3534
	bool var_len;
	size_t data_len;
3535 3536
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3537 3538 3539 3540 3541 3542 3543 3544 3545 3546 3547 3548 3549 3550 3551 3552 3553 3554 3555 3556 3557 3558 3559 3560 3561 3562 3563 3564 3565 3566 3567 3568 3569 3570 3571 3572 3573 3574 3575
	{ 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 },
3576
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3577
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3578
	{ set_bredr,              false, MGMT_SETTING_SIZE },
3579 3580 3581
};


3582 3583
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3584 3585
	void *buf;
	u8 *cp;
3586
	struct mgmt_hdr *hdr;
3587
	u16 opcode, index, len;
3588
	struct hci_dev *hdev = NULL;
3589
	const struct mgmt_handler *handler;
3590 3591 3592 3593 3594 3595 3596
	int err;

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

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

3597
	buf = kmalloc(msglen, GFP_KERNEL);
3598 3599 3600 3601 3602 3603 3604 3605
	if (!buf)
		return -ENOMEM;

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

3606
	hdr = buf;
3607 3608 3609
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3610 3611 3612 3613 3614 3615

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

3616
	if (index != MGMT_INDEX_NONE) {
3617 3618 3619
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3620
					 MGMT_STATUS_INVALID_INDEX);
3621 3622
			goto done;
		}
3623 3624 3625 3626 3627 3628

		if (test_bit(HCI_USER_CHANNEL, &hdev->dev_flags)) {
			err = cmd_status(sk, index, opcode,
					 MGMT_STATUS_INVALID_INDEX);
			goto done;
		}
3629 3630
	}

3631
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3632
	    mgmt_handlers[opcode].func == NULL) {
3633
		BT_DBG("Unknown op %u", opcode);
3634
		err = cmd_status(sk, index, opcode,
3635
				 MGMT_STATUS_UNKNOWN_COMMAND);
3636 3637 3638 3639
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3640
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3641
		err = cmd_status(sk, index, opcode,
3642
				 MGMT_STATUS_INVALID_INDEX);
3643
		goto done;
3644 3645
	}

3646 3647 3648
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3649
	    (!handler->var_len && len != handler->data_len)) {
3650
		err = cmd_status(sk, index, opcode,
3651
				 MGMT_STATUS_INVALID_PARAMS);
3652 3653 3654
		goto done;
	}

3655 3656 3657 3658 3659
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3660
	err = handler->func(sk, hdev, cp, len);
3661 3662 3663
	if (err < 0)
		goto done;

3664 3665 3666
	err = msglen;

done:
3667 3668 3669
	if (hdev)
		hci_dev_put(hdev);

3670 3671 3672
	kfree(buf);
	return err;
}
3673

3674
int mgmt_index_added(struct hci_dev *hdev)
3675
{
3676 3677 3678
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3679
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3680 3681
}

3682
int mgmt_index_removed(struct hci_dev *hdev)
3683
{
3684
	u8 status = MGMT_STATUS_INVALID_INDEX;
3685

3686 3687 3688
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3689
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3690

3691
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3692 3693
}

3694
static void set_bredr_scan(struct hci_request *req)
3695
{
3696
	struct hci_dev *hdev = req->hdev;
3697 3698
	u8 scan = 0;

3699 3700 3701 3702 3703 3704
	/* Ensure that fast connectable is disabled. This function will
	 * not do anything if the page scan parameters are already what
	 * they should be.
	 */
	write_fast_connectable(req, false);

3705 3706 3707 3708 3709
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3710 3711
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3712 3713
}

3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724 3725 3726 3727 3728 3729 3730 3731
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);
}

3732
static int powered_update_hci(struct hci_dev *hdev)
3733
{
3734
	struct hci_request req;
3735
	u8 link_sec;
3736

3737 3738
	hci_req_init(&req, hdev);

3739 3740 3741
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3742

3743
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3744
	}
3745

3746 3747
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
3748
		struct hci_cp_write_le_host_supported cp;
3749

3750 3751
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3752

3753 3754 3755 3756 3757
		/* 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))
3758 3759
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3760 3761 3762

		/* In case BR/EDR was toggled during the AUTO_OFF phase */
		hci_update_ad(&req);
3763
	}
3764

3765 3766 3767 3768 3769 3770
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
		u8 adv = 0x01;

		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(adv), &adv);
	}

3771 3772
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3773 3774
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3775

3776
	if (lmp_bredr_capable(hdev)) {
3777 3778
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
3779
		update_class(&req);
3780
		update_name(&req);
3781
		update_eir(&req);
3782
	}
3783

3784
	return hci_req_run(&req, powered_complete);
3785
}
3786

3787 3788 3789
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3790 3791
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3792
	int err;
3793

3794 3795 3796 3797
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3798 3799
		if (powered_update_hci(hdev) == 0)
			return 0;
3800

3801 3802 3803
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3804 3805
	}

3806 3807 3808 3809 3810 3811 3812 3813
	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:
3814
	err = new_settings(hdev, match.sk);
3815 3816 3817 3818

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

3819
	return err;
3820
}
3821

3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835 3836 3837 3838 3839 3840 3841 3842
int mgmt_set_powered_failed(struct hci_dev *hdev, int err)
{
	struct pending_cmd *cmd;
	u8 status;

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

	if (err == -ERFKILL)
		status = MGMT_STATUS_RFKILLED;
	else
		status = MGMT_STATUS_FAILED;

	err = cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_POWERED, status);

	mgmt_pending_remove(cmd);

	return err;
}

3843
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3844
{
3845
	struct cmd_lookup match = { NULL, hdev };
3846 3847
	bool changed = false;
	int err = 0;
3848

3849 3850 3851 3852 3853 3854 3855
	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;
	}
3856

3857
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3858
			     &match);
3859

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

3863 3864 3865
	if (match.sk)
		sock_put(match.sk);

3866
	return err;
3867
}
3868

3869
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3870
{
3871
	struct pending_cmd *cmd;
3872 3873
	bool changed = false;
	int err = 0;
3874

3875 3876 3877 3878 3879 3880 3881
	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;
	}
3882

3883
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
3884

3885
	if (changed)
3886
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
3887

3888
	return err;
3889
}
3890

3891
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3892
{
3893 3894
	u8 mgmt_err = mgmt_status(status);

3895
	if (scan & SCAN_PAGE)
3896
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3897
				     cmd_status_rsp, &mgmt_err);
3898 3899

	if (scan & SCAN_INQUIRY)
3900
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3901
				     cmd_status_rsp, &mgmt_err);
3902 3903 3904 3905

	return 0;
}

3906 3907
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
3908
{
3909
	struct mgmt_ev_new_link_key ev;
3910

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

3913
	ev.store_hint = persistent;
3914
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3915
	ev.key.addr.type = BDADDR_BREDR;
3916
	ev.key.type = key->type;
3917
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3918
	ev.key.pin_len = key->pin_len;
3919

3920
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3921
}
3922

3923 3924 3925 3926 3927 3928 3929 3930
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);
3931
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3932 3933 3934 3935 3936 3937 3938 3939 3940 3941
	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));

3942 3943
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
3944 3945
}

3946
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3947 3948
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
3949
{
3950 3951 3952
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
3953

3954
	bacpy(&ev->addr.bdaddr, bdaddr);
3955
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3956

3957
	ev->flags = __cpu_to_le32(flags);
3958

3959 3960
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3961
					  name, name_len);
3962 3963

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3964
		eir_len = eir_append_data(ev->eir, eir_len,
3965
					  EIR_CLASS_OF_DEV, dev_class, 3);
3966

3967
	ev->eir_len = cpu_to_le16(eir_len);
3968 3969

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3970
			  sizeof(*ev) + eir_len, NULL);
3971 3972
}

3973 3974
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
3975
	struct mgmt_cp_disconnect *cp = cmd->param;
3976
	struct sock **sk = data;
3977
	struct mgmt_rp_disconnect rp;
3978

3979 3980
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3981

3982
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3983
		     sizeof(rp));
3984 3985 3986 3987

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

3988
	mgmt_pending_remove(cmd);
3989 3990
}

3991
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3992
{
3993
	struct hci_dev *hdev = data;
3994 3995
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
3996 3997

	memset(&rp, 0, sizeof(rp));
3998 3999
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4000

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

4003
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4004 4005 4006 4007

	mgmt_pending_remove(cmd);
}

4008
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
4009
			     u8 link_type, u8 addr_type, u8 reason)
4010
{
4011
	struct mgmt_ev_device_disconnected ev;
4012 4013 4014
	struct sock *sk = NULL;
	int err;

4015
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4016

4017 4018 4019
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4020

4021
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
4022
			 sk);
4023 4024

	if (sk)
4025
		sock_put(sk);
4026

4027
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4028
			     hdev);
4029

4030 4031 4032
	return err;
}

4033
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
4034
			   u8 link_type, u8 addr_type, u8 status)
4035
{
4036
	struct mgmt_rp_disconnect rp;
4037 4038 4039
	struct pending_cmd *cmd;
	int err;

4040 4041 4042
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4043
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4044 4045 4046
	if (!cmd)
		return -ENOENT;

4047
	bacpy(&rp.addr.bdaddr, bdaddr);
4048
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4049

4050
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
4051
			   mgmt_status(status), &rp, sizeof(rp));
4052

4053
	mgmt_pending_remove(cmd);
4054 4055

	return err;
4056
}
4057

4058
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4059
			u8 addr_type, u8 status)
4060 4061 4062
{
	struct mgmt_ev_connect_failed ev;

4063
	bacpy(&ev.addr.bdaddr, bdaddr);
4064
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4065
	ev.status = mgmt_status(status);
4066

4067
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4068
}
4069

4070
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4071 4072 4073
{
	struct mgmt_ev_pin_code_request ev;

4074
	bacpy(&ev.addr.bdaddr, bdaddr);
4075
	ev.addr.type = BDADDR_BREDR;
4076
	ev.secure = secure;
4077

4078
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4079
			  NULL);
4080 4081
}

4082
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4083
				 u8 status)
4084 4085
{
	struct pending_cmd *cmd;
4086
	struct mgmt_rp_pin_code_reply rp;
4087 4088
	int err;

4089
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4090 4091 4092
	if (!cmd)
		return -ENOENT;

4093
	bacpy(&rp.addr.bdaddr, bdaddr);
4094
	rp.addr.type = BDADDR_BREDR;
4095

4096
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4097
			   mgmt_status(status), &rp, sizeof(rp));
4098

4099
	mgmt_pending_remove(cmd);
4100 4101 4102 4103

	return err;
}

4104
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4105
				     u8 status)
4106 4107
{
	struct pending_cmd *cmd;
4108
	struct mgmt_rp_pin_code_reply rp;
4109 4110
	int err;

4111
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4112 4113 4114
	if (!cmd)
		return -ENOENT;

4115
	bacpy(&rp.addr.bdaddr, bdaddr);
4116
	rp.addr.type = BDADDR_BREDR;
4117

4118
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4119
			   mgmt_status(status), &rp, sizeof(rp));
4120

4121
	mgmt_pending_remove(cmd);
4122 4123 4124

	return err;
}
4125

4126
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4127 4128
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4129 4130 4131
{
	struct mgmt_ev_user_confirm_request ev;

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

4134
	bacpy(&ev.addr.bdaddr, bdaddr);
4135
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4136
	ev.confirm_hint = confirm_hint;
4137
	ev.value = value;
4138

4139
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4140
			  NULL);
4141 4142
}

4143
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4144
			      u8 link_type, u8 addr_type)
4145 4146 4147 4148 4149
{
	struct mgmt_ev_user_passkey_request ev;

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

4150
	bacpy(&ev.addr.bdaddr, bdaddr);
4151
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4152 4153

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4154
			  NULL);
4155 4156
}

4157
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4158 4159
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4160 4161 4162 4163 4164
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4165
	cmd = mgmt_pending_find(opcode, hdev);
4166 4167 4168
	if (!cmd)
		return -ENOENT;

4169
	bacpy(&rp.addr.bdaddr, bdaddr);
4170
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4171
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4172
			   &rp, sizeof(rp));
4173

4174
	mgmt_pending_remove(cmd);
4175 4176 4177 4178

	return err;
}

4179
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4180
				     u8 link_type, u8 addr_type, u8 status)
4181
{
4182
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4183
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4184 4185
}

4186
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4187
					 u8 link_type, u8 addr_type, u8 status)
4188
{
4189
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4190 4191
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4192
}
4193

4194
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4195
				     u8 link_type, u8 addr_type, u8 status)
4196
{
4197
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4198
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4199 4200
}

4201
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4202
					 u8 link_type, u8 addr_type, u8 status)
4203
{
4204
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4205 4206
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4207 4208
}

4209 4210 4211 4212 4213 4214 4215 4216 4217 4218 4219 4220 4221 4222 4223 4224
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);
}

4225
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4226
		     u8 addr_type, u8 status)
4227 4228 4229
{
	struct mgmt_ev_auth_failed ev;

4230
	bacpy(&ev.addr.bdaddr, bdaddr);
4231
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4232
	ev.status = mgmt_status(status);
4233

4234
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4235
}
4236

4237 4238 4239
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4240 4241
	bool changed = false;
	int err = 0;
4242 4243 4244 4245

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4246
				     cmd_status_rsp, &mgmt_err);
4247 4248 4249
		return 0;
	}

4250 4251 4252 4253 4254 4255 4256 4257
	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;
	}

4258
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4259
			     &match);
4260

4261 4262
	if (changed)
		err = new_settings(hdev, match.sk);
4263 4264 4265 4266 4267 4268 4269

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

	return err;
}

4270
static void clear_eir(struct hci_request *req)
4271
{
4272
	struct hci_dev *hdev = req->hdev;
4273 4274
	struct hci_cp_write_eir cp;

4275
	if (!lmp_ext_inq_capable(hdev))
4276
		return;
4277

4278 4279
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4282
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4283 4284
}

4285
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4286 4287
{
	struct cmd_lookup match = { NULL, hdev };
4288
	struct hci_request req;
4289 4290
	bool changed = false;
	int err = 0;
4291 4292 4293

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4296
						 &hdev->dev_flags))
4297 4298
			err = new_settings(hdev, NULL);

4299 4300
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4301 4302 4303 4304 4305 4306 4307 4308 4309 4310

		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;
4311 4312 4313 4314
	}

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

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

4318
	if (match.sk)
4319 4320
		sock_put(match.sk);

4321 4322
	hci_req_init(&req, hdev);

4323
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4324
		update_eir(&req);
4325
	else
4326 4327 4328
		clear_eir(&req);

	hci_req_run(&req, NULL);
4329

4330 4331 4332
	return err;
}

4333
static void sk_lookup(struct pending_cmd *cmd, void *data)
4334 4335 4336 4337 4338 4339 4340 4341 4342
{
	struct cmd_lookup *match = data;

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

4343
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4344
				   u8 status)
4345
{
4346 4347
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4348

4349 4350 4351
	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);
4352 4353

	if (!status)
4354 4355
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4356 4357 4358

	if (match.sk)
		sock_put(match.sk);
4359 4360 4361 4362

	return err;
}

4363
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4364 4365
{
	struct mgmt_cp_set_local_name ev;
4366
	struct pending_cmd *cmd;
4367

4368 4369
	if (status)
		return 0;
4370 4371 4372

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

4375
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4376 4377
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4378

4379 4380 4381 4382 4383
		/* 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;
4384
	}
4385

4386 4387
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4388
}
4389

4390
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4391
					    u8 *randomizer, u8 status)
4392 4393 4394 4395
{
	struct pending_cmd *cmd;
	int err;

4396
	BT_DBG("%s status %u", hdev->name, status);
4397

4398
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4399 4400 4401 4402
	if (!cmd)
		return -ENOENT;

	if (status) {
4403 4404
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4405 4406 4407 4408 4409 4410
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4411
		err = cmd_complete(cmd->sk, hdev->id,
4412 4413
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4414 4415 4416 4417 4418 4419
	}

	mgmt_pending_remove(cmd);

	return err;
}
4420

4421
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4422 4423
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
4424
{
4425 4426
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4427
	size_t ev_size;
4428

4429 4430 4431
	if (!hci_discovery_active(hdev))
		return -EPERM;

4432 4433
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4434 4435
		return -EINVAL;

4436 4437
	memset(buf, 0, sizeof(buf));

4438
	bacpy(&ev->addr.bdaddr, bdaddr);
4439
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4440
	ev->rssi = rssi;
4441
	if (cfm_name)
4442
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4443
	if (!ssp)
4444
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4445

4446
	if (eir_len > 0)
4447
		memcpy(ev->eir, eir, eir_len);
4448

4449 4450
	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,
4451
					  dev_class, 3);
4452

4453
	ev->eir_len = cpu_to_le16(eir_len);
4454
	ev_size = sizeof(*ev) + eir_len;
4455

4456
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4457
}
4458

4459
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4460
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4461
{
4462 4463 4464
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4465

4466
	ev = (struct mgmt_ev_device_found *) buf;
4467

4468 4469 4470
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4471
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4472 4473 4474
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4475
				  name_len);
4476

4477
	ev->eir_len = cpu_to_le16(eir_len);
4478

4479
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
4480
			  sizeof(*ev) + eir_len, NULL);
4481
}
4482

4483
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4484
{
4485
	struct mgmt_ev_discovering ev;
4486 4487
	struct pending_cmd *cmd;

4488 4489
	BT_DBG("%s discovering %u", hdev->name, discovering);

4490
	if (discovering)
4491
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4492
	else
4493
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4494 4495

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

4498 4499
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4500 4501 4502
		mgmt_pending_remove(cmd);
	}

4503 4504 4505 4506 4507
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4508
}
4509

4510
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4511 4512 4513 4514
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4515
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4516

4517 4518
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4519

4520
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4521
			  cmd ? cmd->sk : NULL);
4522 4523
}

4524
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4525 4526 4527 4528
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4529
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4530

4531 4532
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4533

4534
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4535
			  cmd ? cmd->sk : NULL);
4536
}