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

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

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

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

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

/* Bluetooth HCI Management interface */

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

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

35 36
bool enable_hs;

37
#define MGMT_VERSION	1
38
#define MGMT_REVISION	3
39

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

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,
103
	MGMT_EV_PASSKEY_NOTIFY,
104 105
};

106
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
107

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

111 112
struct pending_cmd {
	struct list_head list;
113
	u16 opcode;
114
	int index;
115
	void *param;
116
	struct sock *sk;
117
	void *user_data;
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 184
/* 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 */
};

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

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

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

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

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

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

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

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

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

225
	return err;
226 227
}

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

259
	return err;
260 261
}

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

	return err;
}

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

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

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

328 329 330
		count++;
	}

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

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

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

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

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

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

356 357
	read_unlock(&hci_dev_list_lock);

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

361 362 363
	kfree(rp);

	return err;
364 365
}

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

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

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

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

385 386 387
	if (enable_hs)
		settings |= MGMT_SETTING_HS;

388
	if (lmp_le_capable(hdev)) {
389
		settings |= MGMT_SETTING_LE;
390 391
		settings |= MGMT_SETTING_ADVERTISING;
	}
392 393 394 395 396 397 398 399

	return settings;
}

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

400
	if (hdev_is_powered(hdev))
401 402
		settings |= MGMT_SETTING_POWERED;

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

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

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

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

415
	if (lmp_bredr_capable(hdev))
416 417
		settings |= MGMT_SETTING_BREDR;

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

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

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

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

430 431 432
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags))
		settings |= MGMT_SETTING_ADVERTISING;

433 434 435
	return settings;
}

436 437
#define PNP_INFO_SVCLASS_ID		0x1200

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 477 478 479
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;
}

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 510 511 512
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;
}

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 543 544 545
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;
}

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

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

		ptr += 3;
	}

577 578 579 580 581 582 583 584 585 586 587 588
	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;
	}

589
	ptr = create_uuid16_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
590
	ptr = create_uuid32_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
591
	ptr = create_uuid128_list(hdev, ptr, HCI_MAX_EIR_LENGTH - (ptr - data));
592 593
}

594
static void update_eir(struct hci_request *req)
595
{
596
	struct hci_dev *hdev = req->hdev;
597 598
	struct hci_cp_write_eir cp;

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

602
	if (!lmp_ext_inq_capable(hdev))
603
		return;
604

605
	if (!test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
606
		return;
607

608
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
609
		return;
610 611 612 613 614 615

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

	create_eir(hdev, cp.data);

	if (memcmp(cp.data, hdev->eir, sizeof(cp.data)) == 0)
616
		return;
617 618 619

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

620
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
621 622 623 624 625 626 627 628 629 630 631 632 633
}

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

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

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

641
	if (!hdev_is_powered(hdev))
642
		return;
643

644
	if (test_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
645
		return;
646 647 648 649 650 651

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

	if (memcmp(cod, hdev->dev_class, 3) == 0)
652
		return;
653

654
	hci_req_add(req, HCI_OP_WRITE_CLASS_OF_DEV, sizeof(cod), cod);
655 656
}

657 658 659
static void service_cache_off(struct work_struct *work)
{
	struct hci_dev *hdev = container_of(work, struct hci_dev,
660
					    service_cache.work);
661
	struct hci_request req;
662

663
	if (!test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags))
664 665
		return;

666 667
	hci_req_init(&req, hdev);

668 669
	hci_dev_lock(hdev);

670 671
	update_eir(&req);
	update_class(&req);
672 673

	hci_dev_unlock(hdev);
674 675

	hci_req_run(&req, NULL);
676 677
}

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

683
	INIT_DELAYED_WORK(&hdev->service_cache, service_cache_off);
684

685 686 687 688 689 690
	/* 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);
691 692
}

693
static int read_controller_info(struct sock *sk, struct hci_dev *hdev,
694
				void *data, u16 data_len)
695
{
696
	struct mgmt_rp_read_info rp;
697

698
	BT_DBG("sock %p %s", sk, hdev->name);
699

700
	hci_dev_lock(hdev);
701

702 703
	memset(&rp, 0, sizeof(rp));

704
	bacpy(&rp.bdaddr, &hdev->bdaddr);
705

706
	rp.version = hdev->hci_ver;
707
	rp.manufacturer = cpu_to_le16(hdev->manufacturer);
708 709 710

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

712
	memcpy(rp.dev_class, hdev->dev_class, 3);
713

714
	memcpy(rp.name, hdev->dev_name, sizeof(hdev->dev_name));
715
	memcpy(rp.short_name, hdev->short_name, sizeof(hdev->short_name));
716

717
	hci_dev_unlock(hdev);
718

719
	return cmd_complete(sk, hdev->id, MGMT_OP_READ_INFO, 0, &rp,
720
			    sizeof(rp));
721 722
}

723 724 725
static void mgmt_pending_free(struct pending_cmd *cmd)
{
	sock_put(cmd->sk);
726
	kfree(cmd->param);
727 728 729
	kfree(cmd);
}

730
static struct pending_cmd *mgmt_pending_add(struct sock *sk, u16 opcode,
731 732
					    struct hci_dev *hdev, void *data,
					    u16 len)
733 734 735
{
	struct pending_cmd *cmd;

736
	cmd = kmalloc(sizeof(*cmd), GFP_KERNEL);
737
	if (!cmd)
738
		return NULL;
739 740

	cmd->opcode = opcode;
741
	cmd->index = hdev->id;
742

743
	cmd->param = kmalloc(len, GFP_KERNEL);
744
	if (!cmd->param) {
745
		kfree(cmd);
746
		return NULL;
747 748
	}

749 750
	if (data)
		memcpy(cmd->param, data, len);
751 752 753 754

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

755
	list_add(&cmd->list, &hdev->mgmt_pending);
756

757
	return cmd;
758 759
}

760
static void mgmt_pending_foreach(u16 opcode, struct hci_dev *hdev,
761 762
				 void (*cb)(struct pending_cmd *cmd,
					    void *data),
763
				 void *data)
764
{
765
	struct pending_cmd *cmd, *tmp;
766

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

		cb(cmd, data);
	}
}

775
static struct pending_cmd *mgmt_pending_find(u16 opcode, struct hci_dev *hdev)
776
{
777
	struct pending_cmd *cmd;
778

779
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
780 781
		if (cmd->opcode == opcode)
			return cmd;
782 783 784 785 786
	}

	return NULL;
}

787
static void mgmt_pending_remove(struct pending_cmd *cmd)
788 789 790 791 792
{
	list_del(&cmd->list);
	mgmt_pending_free(cmd);
}

793
static int send_settings_rsp(struct sock *sk, u16 opcode, struct hci_dev *hdev)
794
{
795
	__le32 settings = cpu_to_le32(get_current_settings(hdev));
796

797
	return cmd_complete(sk, hdev->id, opcode, 0, &settings,
798
			    sizeof(settings));
799 800
}

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

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

810 811 812 813
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				  MGMT_STATUS_INVALID_PARAMS);

814
	hci_dev_lock(hdev);
815

816 817 818 819 820 821
	if (mgmt_pending_find(MGMT_OP_SET_POWERED, hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_POWERED,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

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

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

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

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

844
	if (cp->val)
845
		queue_work(hdev->req_workqueue, &hdev->power_on);
846
	else
847
		queue_work(hdev->req_workqueue, &hdev->power_off.work);
848

849
	err = 0;
850 851

failed:
852
	hci_dev_unlock(hdev);
853
	return err;
854 855
}

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

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

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

877 878 879
	/* Time stamp */
	__net_timestamp(skb);

880 881 882 883 884 885 886 887 888 889 890 891 892 893 894
	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);
}

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 922 923 924
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);
}

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

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

936 937 938 939
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				 MGMT_STATUS_NOT_SUPPORTED);

940 941 942 943
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

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

949
	hci_dev_lock(hdev);
950

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

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

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

	if (!hdev_is_powered(hdev)) {
971 972 973 974 975 976 977
		bool changed = false;

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

978
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
979 980 981 982 983 984
		if (err < 0)
			goto failed;

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

985 986 987 988
		goto failed;
	}

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

1000
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1001 1002 1003
		goto failed;
	}

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

	scan = SCAN_PAGE;

1012
	if (cp->val)
1013
		scan |= SCAN_INQUIRY;
1014
	else
1015
		cancel_delayed_work(&hdev->discov_off);
1016 1017 1018

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

1021
	if (cp->val)
1022
		hdev->discov_timeout = timeout;
1023

1024
failed:
1025
	hci_dev_unlock(hdev);
1026 1027 1028
	return err;
}

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

1035 1036 1037
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051
	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);

1052 1053 1054 1055 1056 1057 1058
	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);
1059 1060
}

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

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

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

1092 1093 1094 1095
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

1096 1097 1098 1099
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1100
	hci_dev_lock(hdev);
1101

1102
	if (!hdev_is_powered(hdev)) {
1103 1104 1105 1106 1107
		bool changed = false;

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

1108
		if (cp->val) {
1109
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1110
		} else {
1111 1112 1113
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1114

1115
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1116 1117 1118 1119 1120 1121
		if (err < 0)
			goto failed;

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

1122 1123 1124
		goto failed;
	}

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

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

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

1143
	if (cp->val) {
1144
		scan = SCAN_PAGE;
1145
	} else {
1146 1147
		scan = 0;

1148
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1149
		    hdev->discov_timeout > 0)
1150 1151 1152
			cancel_delayed_work(&hdev->discov_off);
	}

1153 1154 1155 1156
	hci_req_init(&req, hdev);

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

1157 1158 1159 1160 1161 1162 1163
	/* 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))
1164 1165
		write_fast_connectable(&req, false);

1166
	err = hci_req_run(&req, set_connectable_complete);
1167
	if (err < 0)
1168
		mgmt_pending_remove(cmd);
1169 1170

failed:
1171
	hci_dev_unlock(hdev);
1172 1173 1174
	return err;
}

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

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

1183 1184 1185 1186
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1187
	hci_dev_lock(hdev);
1188 1189

	if (cp->val)
1190
		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1191
	else
1192
		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1193

1194
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1195 1196 1197
	if (err < 0)
		goto failed;

1198
	err = new_settings(hdev, sk);
1199 1200

failed:
1201
	hci_dev_unlock(hdev);
1202 1203 1204
	return err;
}

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

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

1215 1216 1217 1218
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_NOT_SUPPORTED);

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

1223 1224
	hci_dev_lock(hdev);

1225
	if (!hdev_is_powered(hdev)) {
1226 1227 1228
		bool changed = false;

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

1241 1242 1243 1244
		goto failed;
	}

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

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

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

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

1283 1284 1285
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1286

1287 1288 1289 1290
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1291
	hci_dev_lock(hdev);
1292

1293 1294
	val = !!cp->val;

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

1310 1311 1312 1313
		goto failed;
	}

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

1341
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1342 1343 1344
{
	struct mgmt_mode *cp = data;

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

1347 1348
	if (!enable_hs)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
1349
				  MGMT_STATUS_NOT_SUPPORTED);
1350

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

1355 1356 1357 1358 1359
	if (cp->val)
		set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
	else
		clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);

1360
	return send_settings_rsp(sk, MGMT_OP_SET_HS, hdev);
1361 1362
}

1363 1364 1365 1366 1367 1368 1369 1370 1371 1372 1373 1374 1375 1376 1377 1378 1379 1380 1381 1382
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);
}

1383
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1384 1385 1386 1387
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1388
	struct hci_request req;
1389
	int err;
1390
	u8 val, enabled;
1391

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

1394 1395 1396
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1397

1398 1399 1400 1401
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1402 1403 1404 1405 1406
	/* LE-only devices do not allow toggling LE on/off */
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1407
	hci_dev_lock(hdev);
1408 1409

	val = !!cp->val;
1410
	enabled = lmp_host_le_capable(hdev);
1411

1412
	if (!hdev_is_powered(hdev) || val == enabled) {
1413 1414 1415 1416 1417 1418 1419
		bool changed = false;

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

1420 1421 1422 1423 1424
		if (!val && test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
			clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
			changed = true;
		}

1425 1426
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1427
			goto unlock;
1428 1429 1430 1431

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

1432
		goto unlock;
1433 1434
	}

1435 1436
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1437
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1438
				 MGMT_STATUS_BUSY);
1439
		goto unlock;
1440 1441 1442 1443 1444
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1445
		goto unlock;
1446 1447 1448 1449 1450 1451
	}

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

	if (val) {
		hci_cp.le = val;
1452
		hci_cp.simul = lmp_le_br_capable(hdev);
1453 1454
	}

1455 1456
	hci_req_init(&req, hdev);

1457 1458 1459
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags) && !val)
		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

1460 1461 1462 1463
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1464
	if (err < 0)
1465 1466
		mgmt_pending_remove(cmd);

1467 1468
unlock:
	hci_dev_unlock(hdev);
1469 1470 1471
	return err;
}

1472 1473 1474 1475 1476 1477 1478 1479 1480 1481 1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494
/* 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;
}

1495 1496 1497 1498 1499 1500 1501 1502 1503 1504 1505 1506 1507 1508 1509 1510 1511 1512 1513
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;
}

1514 1515 1516 1517 1518 1519 1520 1521 1522 1523 1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539
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);
}

1540
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1541
{
1542
	struct mgmt_cp_add_uuid *cp = data;
1543
	struct pending_cmd *cmd;
1544
	struct hci_request req;
1545 1546 1547
	struct bt_uuid *uuid;
	int err;

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

1550
	hci_dev_lock(hdev);
1551

1552
	if (pending_eir_or_class(hdev)) {
1553
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1554
				 MGMT_STATUS_BUSY);
1555 1556 1557
		goto failed;
	}

1558
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1559 1560 1561 1562 1563 1564
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1565
	uuid->svc_hint = cp->svc_hint;
1566
	uuid->size = get_uuid_size(cp->uuid);
1567

1568
	list_add_tail(&uuid->list, &hdev->uuids);
1569

1570
	hci_req_init(&req, hdev);
1571

1572 1573 1574
	update_class(&req);
	update_eir(&req);

1575 1576 1577 1578
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1579

1580
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1581
				   hdev->dev_class, 3);
1582 1583 1584 1585
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1586
	if (!cmd) {
1587
		err = -ENOMEM;
1588 1589 1590 1591
		goto failed;
	}

	err = 0;
1592 1593

failed:
1594
	hci_dev_unlock(hdev);
1595 1596 1597
	return err;
}

1598 1599 1600 1601 1602 1603
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)) {
1604 1605
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1606 1607 1608 1609 1610 1611
		return true;
	}

	return false;
}

1612 1613 1614 1615 1616 1617 1618
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);
}

1619
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1620
		       u16 len)
1621
{
1622
	struct mgmt_cp_remove_uuid *cp = data;
1623
	struct pending_cmd *cmd;
1624
	struct bt_uuid *match, *tmp;
1625
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1626
	struct hci_request req;
1627 1628
	int err, found;

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

1631
	hci_dev_lock(hdev);
1632

1633
	if (pending_eir_or_class(hdev)) {
1634
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1635
				 MGMT_STATUS_BUSY);
1636 1637 1638
		goto unlock;
	}

1639 1640
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1641

1642
		if (enable_service_cache(hdev)) {
1643
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1644
					   0, hdev->dev_class, 3);
1645 1646
			goto unlock;
		}
1647

1648
		goto update_class;
1649 1650 1651 1652
	}

	found = 0;

1653
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1654 1655 1656 1657
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1658
		kfree(match);
1659 1660 1661 1662
		found++;
	}

	if (found == 0) {
1663
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1664
				 MGMT_STATUS_INVALID_PARAMS);
1665 1666 1667
		goto unlock;
	}

1668
update_class:
1669
	hci_req_init(&req, hdev);
1670

1671 1672 1673
	update_class(&req);
	update_eir(&req);

1674 1675 1676 1677
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1678

1679
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1680
				   hdev->dev_class, 3);
1681 1682 1683 1684
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1685
	if (!cmd) {
1686
		err = -ENOMEM;
1687 1688 1689 1690
		goto unlock;
	}

	err = 0;
1691 1692

unlock:
1693
	hci_dev_unlock(hdev);
1694 1695 1696
	return err;
}

1697 1698 1699 1700 1701 1702 1703
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);
}

1704
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1705
			 u16 len)
1706
{
1707
	struct mgmt_cp_set_dev_class *cp = data;
1708
	struct pending_cmd *cmd;
1709
	struct hci_request req;
1710 1711
	int err;

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

1714 1715 1716
	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1717

1718
	hci_dev_lock(hdev);
1719

1720 1721 1722 1723 1724
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1725

1726 1727 1728 1729 1730
	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;
	}
1731

1732 1733 1734
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1735
	if (!hdev_is_powered(hdev)) {
1736
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1737
				   hdev->dev_class, 3);
1738 1739 1740
		goto unlock;
	}

1741 1742
	hci_req_init(&req, hdev);

1743
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1744 1745 1746
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1747
		update_eir(&req);
1748
	}
1749

1750 1751
	update_class(&req);

1752 1753 1754 1755
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1756

1757
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1758
				   hdev->dev_class, 3);
1759 1760 1761 1762
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1763
	if (!cmd) {
1764
		err = -ENOMEM;
1765 1766 1767 1768
		goto unlock;
	}

	err = 0;
1769

1770
unlock:
1771
	hci_dev_unlock(hdev);
1772 1773 1774
	return err;
}

1775
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1776
			  u16 len)
1777
{
1778
	struct mgmt_cp_load_link_keys *cp = data;
1779
	u16 key_count, expected_len;
1780
	int i;
1781

1782
	key_count = __le16_to_cpu(cp->key_count);
1783

1784 1785
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1786
	if (expected_len != len) {
1787
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1788
		       len, expected_len);
1789
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1790
				  MGMT_STATUS_INVALID_PARAMS);
1791 1792
	}

1793 1794 1795 1796
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1797
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1798
	       key_count);
1799

1800 1801 1802 1803 1804 1805 1806 1807
	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);
	}

1808
	hci_dev_lock(hdev);
1809 1810 1811 1812

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
1813
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1814
	else
1815
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1816

1817
	for (i = 0; i < key_count; i++) {
1818
		struct mgmt_link_key_info *key = &cp->keys[i];
1819

1820
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1821
				 key->type, key->pin_len);
1822 1823
	}

1824
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1825

1826
	hci_dev_unlock(hdev);
1827

1828
	return 0;
1829 1830
}

1831
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1832
			   u8 addr_type, struct sock *skip_sk)
1833 1834 1835 1836 1837 1838 1839
{
	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),
1840
			  skip_sk);
1841 1842
}

1843
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1844
			 u16 len)
1845
{
1846 1847
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1848 1849
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1850 1851 1852
	struct hci_conn *conn;
	int err;

1853
	memset(&rp, 0, sizeof(rp));
1854 1855
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1856

1857 1858 1859 1860 1861
	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));

1862 1863 1864 1865 1866
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1867 1868
	hci_dev_lock(hdev);

1869
	if (!hdev_is_powered(hdev)) {
1870
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1871
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1872 1873 1874
		goto unlock;
	}

1875
	if (cp->addr.type == BDADDR_BREDR)
1876 1877 1878
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1879

1880
	if (err < 0) {
1881
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1882
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1883 1884 1885
		goto unlock;
	}

1886
	if (cp->disconnect) {
1887
		if (cp->addr.type == BDADDR_BREDR)
1888
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1889
						       &cp->addr.bdaddr);
1890 1891
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1892
						       &cp->addr.bdaddr);
1893 1894 1895
	} else {
		conn = NULL;
	}
1896

1897
	if (!conn) {
1898
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1899
				   &rp, sizeof(rp));
1900
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1901 1902
		goto unlock;
	}
1903

1904
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1905
			       sizeof(*cp));
1906 1907 1908
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1909 1910
	}

1911
	dc.handle = cpu_to_le16(conn->handle);
1912 1913 1914 1915 1916
	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);

1917
unlock:
1918
	hci_dev_unlock(hdev);
1919 1920 1921
	return err;
}

1922
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1923
		      u16 len)
1924
{
1925
	struct mgmt_cp_disconnect *cp = data;
1926
	struct mgmt_rp_disconnect rp;
1927
	struct hci_cp_disconnect dc;
1928
	struct pending_cmd *cmd;
1929 1930 1931 1932 1933
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1934 1935 1936 1937
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1938
	if (!bdaddr_type_is_valid(cp->addr.type))
1939 1940 1941
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1942

1943
	hci_dev_lock(hdev);
1944 1945

	if (!test_bit(HCI_UP, &hdev->flags)) {
1946 1947
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1948 1949 1950
		goto failed;
	}

1951
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1952 1953
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1954 1955 1956
		goto failed;
	}

1957
	if (cp->addr.type == BDADDR_BREDR)
1958 1959
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
1960 1961
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1962

1963
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1964 1965
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1966 1967 1968
		goto failed;
	}

1969
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1970 1971
	if (!cmd) {
		err = -ENOMEM;
1972
		goto failed;
1973
	}
1974

1975
	dc.handle = cpu_to_le16(conn->handle);
1976
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1977 1978 1979

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
1980
		mgmt_pending_remove(cmd);
1981 1982

failed:
1983
	hci_dev_unlock(hdev);
1984 1985 1986
	return err;
}

1987
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
1988 1989 1990
{
	switch (link_type) {
	case LE_LINK:
1991 1992
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
1993
			return BDADDR_LE_PUBLIC;
1994

1995
		default:
1996
			/* Fallback to LE Random address type */
1997
			return BDADDR_LE_RANDOM;
1998
		}
1999

2000
	default:
2001
		/* Fallback to BR/EDR type */
2002
		return BDADDR_BREDR;
2003 2004 2005
	}
}

2006 2007
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2008 2009
{
	struct mgmt_rp_get_connections *rp;
2010
	struct hci_conn *c;
2011
	size_t rp_len;
2012 2013
	int err;
	u16 i;
2014 2015 2016

	BT_DBG("");

2017
	hci_dev_lock(hdev);
2018

2019
	if (!hdev_is_powered(hdev)) {
2020
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2021
				 MGMT_STATUS_NOT_POWERED);
2022 2023 2024
		goto unlock;
	}

2025
	i = 0;
2026 2027
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2028
			i++;
2029 2030
	}

2031
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2032
	rp = kmalloc(rp_len, GFP_KERNEL);
2033
	if (!rp) {
2034 2035 2036 2037 2038
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2039
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2040 2041
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2042
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2043
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2044
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2045 2046 2047 2048
			continue;
		i++;
	}

2049
	rp->conn_count = cpu_to_le16(i);
2050

2051 2052
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2053

2054
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2055
			   rp_len);
2056

2057
	kfree(rp);
2058 2059

unlock:
2060
	hci_dev_unlock(hdev);
2061 2062 2063
	return err;
}

2064
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2065
				   struct mgmt_cp_pin_code_neg_reply *cp)
2066 2067 2068 2069
{
	struct pending_cmd *cmd;
	int err;

2070
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2071
			       sizeof(*cp));
2072 2073 2074
	if (!cmd)
		return -ENOMEM;

2075
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2076
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2077 2078 2079 2080 2081 2082
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2083
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2084
			  u16 len)
2085
{
2086
	struct hci_conn *conn;
2087
	struct mgmt_cp_pin_code_reply *cp = data;
2088
	struct hci_cp_pin_code_reply reply;
2089
	struct pending_cmd *cmd;
2090 2091 2092 2093
	int err;

	BT_DBG("");

2094
	hci_dev_lock(hdev);
2095

2096
	if (!hdev_is_powered(hdev)) {
2097
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2098
				 MGMT_STATUS_NOT_POWERED);
2099 2100 2101
		goto failed;
	}

2102
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2103
	if (!conn) {
2104
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2105
				 MGMT_STATUS_NOT_CONNECTED);
2106 2107 2108 2109
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2110 2111 2112
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2113 2114 2115

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

2116
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2117
		if (err >= 0)
2118
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2119
					 MGMT_STATUS_INVALID_PARAMS);
2120 2121 2122 2123

		goto failed;
	}

2124
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2125 2126
	if (!cmd) {
		err = -ENOMEM;
2127
		goto failed;
2128
	}
2129

2130
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2131
	reply.pin_len = cp->pin_len;
2132
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2133 2134 2135

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2136
		mgmt_pending_remove(cmd);
2137 2138

failed:
2139
	hci_dev_unlock(hdev);
2140 2141 2142
	return err;
}

2143 2144
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2145
{
2146
	struct mgmt_cp_set_io_capability *cp = data;
2147 2148 2149

	BT_DBG("");

2150
	hci_dev_lock(hdev);
2151 2152 2153 2154

	hdev->io_capability = cp->io_capability;

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

2157
	hci_dev_unlock(hdev);
2158

2159 2160
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2161 2162
}

2163
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2164 2165
{
	struct hci_dev *hdev = conn->hdev;
2166
	struct pending_cmd *cmd;
2167

2168
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185
		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;

2186
	bacpy(&rp.addr.bdaddr, &conn->dst);
2187
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2188

2189
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2190
		     &rp, sizeof(rp));
2191 2192 2193 2194 2195 2196

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

2197
	hci_conn_drop(conn);
2198

2199
	mgmt_pending_remove(cmd);
2200 2201 2202 2203 2204 2205 2206 2207 2208
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2209
	if (!cmd)
2210
		BT_DBG("Unable to find a pending command");
2211
	else
2212
		pairing_complete(cmd, mgmt_status(status));
2213 2214
}

2215 2216 2217 2218 2219 2220 2221 2222 2223 2224 2225 2226 2227 2228 2229 2230
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));
}

2231
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2232
		       u16 len)
2233
{
2234
	struct mgmt_cp_pair_device *cp = data;
2235
	struct mgmt_rp_pair_device rp;
2236 2237 2238 2239 2240 2241 2242
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2243 2244 2245 2246
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2247 2248 2249 2250 2251
	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));

2252
	hci_dev_lock(hdev);
2253

2254
	if (!hdev_is_powered(hdev)) {
2255 2256
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2257 2258 2259
		goto unlock;
	}

2260 2261
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2262
		auth_type = HCI_AT_DEDICATED_BONDING;
2263
	else
2264 2265
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2266
	if (cp->addr.type == BDADDR_BREDR)
2267 2268
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2269
	else
2270 2271
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2272

2273
	if (IS_ERR(conn)) {
2274 2275 2276 2277 2278 2279 2280
		int status;

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

2281
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2282
				   status, &rp,
2283
				   sizeof(rp));
2284 2285 2286 2287
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2288
		hci_conn_drop(conn);
2289
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2290
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2291 2292 2293
		goto unlock;
	}

2294
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2295 2296
	if (!cmd) {
		err = -ENOMEM;
2297
		hci_conn_drop(conn);
2298 2299 2300
		goto unlock;
	}

2301
	/* For LE, just connecting isn't a proof that the pairing finished */
2302
	if (cp->addr.type == BDADDR_BREDR)
2303
		conn->connect_cfm_cb = pairing_complete_cb;
2304 2305
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2306

2307 2308 2309 2310 2311 2312
	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 &&
2313
	    hci_conn_security(conn, sec_level, auth_type))
2314 2315 2316 2317 2318
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2319
	hci_dev_unlock(hdev);
2320 2321 2322
	return err;
}

2323 2324
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2325
{
2326
	struct mgmt_addr_info *addr = data;
2327 2328 2329 2330 2331 2332 2333 2334
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2335
	if (!hdev_is_powered(hdev)) {
2336
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2337
				 MGMT_STATUS_NOT_POWERED);
2338 2339 2340
		goto unlock;
	}

2341 2342
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2343
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2344
				 MGMT_STATUS_INVALID_PARAMS);
2345 2346 2347 2348 2349 2350
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2351
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2352
				 MGMT_STATUS_INVALID_PARAMS);
2353 2354 2355 2356 2357
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2358
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2359
			   addr, sizeof(*addr));
2360 2361 2362 2363 2364
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2365
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2366
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2367
			     u16 hci_op, __le32 passkey)
2368 2369
{
	struct pending_cmd *cmd;
2370
	struct hci_conn *conn;
2371 2372
	int err;

2373
	hci_dev_lock(hdev);
2374

2375
	if (!hdev_is_powered(hdev)) {
2376 2377 2378
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2379
		goto done;
2380 2381
	}

2382 2383
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2384
	else
2385
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2386 2387

	if (!conn) {
2388 2389 2390
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2391 2392
		goto done;
	}
2393

2394
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2395
		/* Continue with pairing via SMP */
2396 2397 2398
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2399 2400 2401
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2402
		else
2403 2404 2405
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2406 2407 2408 2409

		goto done;
	}

2410
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2411 2412
	if (!cmd) {
		err = -ENOMEM;
2413
		goto done;
2414 2415
	}

2416
	/* Continue with pairing via HCI */
2417 2418 2419
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2420
		bacpy(&cp.bdaddr, &addr->bdaddr);
2421 2422 2423
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2424 2425
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2426

2427 2428
	if (err < 0)
		mgmt_pending_remove(cmd);
2429

2430
done:
2431
	hci_dev_unlock(hdev);
2432 2433 2434
	return err;
}

2435 2436 2437 2438 2439 2440 2441
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("");

2442
	return user_pairing_resp(sk, hdev, &cp->addr,
2443 2444 2445 2446
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2447 2448
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2449
{
2450
	struct mgmt_cp_user_confirm_reply *cp = data;
2451 2452 2453 2454

	BT_DBG("");

	if (len != sizeof(*cp))
2455
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2456
				  MGMT_STATUS_INVALID_PARAMS);
2457

2458
	return user_pairing_resp(sk, hdev, &cp->addr,
2459 2460
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2461 2462
}

2463
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2464
				  void *data, u16 len)
2465
{
2466
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2467 2468 2469

	BT_DBG("");

2470
	return user_pairing_resp(sk, hdev, &cp->addr,
2471 2472
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2473 2474
}

2475 2476
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2477
{
2478
	struct mgmt_cp_user_passkey_reply *cp = data;
2479 2480 2481

	BT_DBG("");

2482
	return user_pairing_resp(sk, hdev, &cp->addr,
2483 2484
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2485 2486
}

2487
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2488
				  void *data, u16 len)
2489
{
2490
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2491 2492 2493

	BT_DBG("");

2494
	return user_pairing_resp(sk, hdev, &cp->addr,
2495 2496
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2497 2498
}

2499
static void update_name(struct hci_request *req)
2500
{
2501
	struct hci_dev *hdev = req->hdev;
2502 2503
	struct hci_cp_write_local_name cp;

2504
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2505

2506
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2507 2508
}

2509 2510 2511 2512 2513 2514 2515 2516 2517 2518 2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536
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);
}

2537
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2538
			  u16 len)
2539
{
2540
	struct mgmt_cp_set_local_name *cp = data;
2541
	struct pending_cmd *cmd;
2542
	struct hci_request req;
2543 2544 2545 2546
	int err;

	BT_DBG("");

2547
	hci_dev_lock(hdev);
2548

2549 2550 2551 2552 2553 2554 2555 2556 2557 2558 2559
	/* 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;
	}

2560
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2561

2562
	if (!hdev_is_powered(hdev)) {
2563
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2564 2565

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2566
				   data, len);
2567 2568 2569 2570
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2571
				 sk);
2572

2573 2574 2575
		goto failed;
	}

2576
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2577 2578 2579 2580 2581
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2582 2583
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2584
	hci_req_init(&req, hdev);
2585 2586 2587 2588 2589 2590 2591 2592 2593

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

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

2594
	err = hci_req_run(&req, set_name_complete);
2595 2596 2597 2598
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2599
	hci_dev_unlock(hdev);
2600 2601 2602
	return err;
}

2603
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2604
			       void *data, u16 data_len)
2605 2606 2607 2608
{
	struct pending_cmd *cmd;
	int err;

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

2611
	hci_dev_lock(hdev);
2612

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

2619
	if (!lmp_ssp_capable(hdev)) {
2620
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2621
				 MGMT_STATUS_NOT_SUPPORTED);
2622 2623 2624
		goto unlock;
	}

2625
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2626
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2627
				 MGMT_STATUS_BUSY);
2628 2629 2630
		goto unlock;
	}

2631
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2632 2633 2634 2635 2636 2637 2638 2639 2640 2641
	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:
2642
	hci_dev_unlock(hdev);
2643 2644 2645
	return err;
}

2646
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2647
			       void *data, u16 len)
2648
{
2649
	struct mgmt_cp_add_remote_oob_data *cp = data;
2650
	u8 status;
2651 2652
	int err;

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

2655
	hci_dev_lock(hdev);
2656

2657
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2658
				      cp->randomizer);
2659
	if (err < 0)
2660
		status = MGMT_STATUS_FAILED;
2661
	else
2662
		status = MGMT_STATUS_SUCCESS;
2663

2664
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2665
			   &cp->addr, sizeof(cp->addr));
2666

2667
	hci_dev_unlock(hdev);
2668 2669 2670
	return err;
}

2671
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2672
				  void *data, u16 len)
2673
{
2674
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2675
	u8 status;
2676 2677
	int err;

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

2680
	hci_dev_lock(hdev);
2681

2682
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2683
	if (err < 0)
2684
		status = MGMT_STATUS_INVALID_PARAMS;
2685
	else
2686
		status = MGMT_STATUS_SUCCESS;
2687

2688
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2689
			   status, &cp->addr, sizeof(cp->addr));
2690

2691
	hci_dev_unlock(hdev);
2692 2693 2694
	return err;
}

2695 2696 2697 2698 2699 2700 2701 2702 2703 2704 2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715
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;
}

2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728 2729 2730 2731 2732 2733
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,
2734
				   DISCOV_LE_TIMEOUT);
2735 2736 2737 2738
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2739
				   DISCOV_INTERLEAVED_TIMEOUT);
2740 2741 2742 2743 2744 2745 2746 2747 2748 2749
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

2750
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2751
			   void *data, u16 len)
2752
{
2753
	struct mgmt_cp_start_discovery *cp = data;
2754
	struct pending_cmd *cmd;
2755 2756 2757 2758 2759 2760
	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 };
2761 2762
	int err;

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

2765
	hci_dev_lock(hdev);
2766

2767
	if (!hdev_is_powered(hdev)) {
2768
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2769
				 MGMT_STATUS_NOT_POWERED);
2770 2771 2772
		goto failed;
	}

2773 2774 2775 2776 2777 2778
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2779
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2780
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2781
				 MGMT_STATUS_BUSY);
2782 2783 2784
		goto failed;
	}

2785
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2786 2787 2788 2789 2790
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2791 2792
	hdev->discovery.type = cp->type;

2793 2794
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
2795
	switch (hdev->discovery.type) {
2796
	case DISCOV_TYPE_BREDR:
2797 2798 2799 2800 2801 2802 2803
		if (!lmp_bredr_capable(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2804 2805 2806 2807 2808 2809 2810 2811 2812 2813 2814
		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));
2815
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
2816
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
2817 2818 2819
		break;

	case DISCOV_TYPE_LE:
2820
	case DISCOV_TYPE_INTERLEAVED:
2821
		if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
2822 2823 2824 2825 2826 2827
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2828 2829
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
		    !lmp_bredr_capable(hdev)) {
2830 2831 2832 2833 2834 2835
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2836 2837 2838 2839 2840 2841 2842 2843 2844 2845 2846 2847 2848 2849 2850 2851
		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;
2852 2853
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
2854 2855 2856 2857 2858 2859 2860 2861
		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);
2862 2863
		break;

2864
	default:
2865 2866 2867 2868
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2869
	}
2870

2871
	err = hci_req_run(&req, start_discovery_complete);
2872 2873
	if (err < 0)
		mgmt_pending_remove(cmd);
2874 2875
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2876 2877

failed:
2878
	hci_dev_unlock(hdev);
2879 2880 2881
	return err;
}

2882 2883 2884 2885 2886 2887 2888 2889 2890 2891 2892 2893 2894 2895 2896 2897
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;
}

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

2915
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2916
			  u16 len)
2917
{
2918
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2919
	struct pending_cmd *cmd;
2920 2921
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2922 2923
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
2924 2925
	int err;

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

2928
	hci_dev_lock(hdev);
2929

2930
	if (!hci_discovery_active(hdev)) {
2931
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2932 2933
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2934 2935 2936 2937
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
2938
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2939 2940
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2941
		goto unlock;
2942 2943
	}

2944
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2945 2946
	if (!cmd) {
		err = -ENOMEM;
2947 2948 2949
		goto unlock;
	}

2950 2951
	hci_req_init(&req, hdev);

2952 2953
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
2954 2955 2956 2957 2958 2959 2960 2961 2962 2963
		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);
		}
2964

2965 2966 2967 2968
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2969
						     NAME_PENDING);
2970
		if (!e) {
2971
			mgmt_pending_remove(cmd);
2972 2973 2974 2975 2976 2977 2978
			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;
		}
2979

2980
		bacpy(&cp.bdaddr, &e->data.bdaddr);
2981 2982
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
2983 2984 2985 2986 2987

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
2988 2989 2990 2991 2992 2993

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

2996
	err = hci_req_run(&req, stop_discovery_complete);
2997 2998
	if (err < 0)
		mgmt_pending_remove(cmd);
2999 3000
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3001

3002
unlock:
3003
	hci_dev_unlock(hdev);
3004 3005 3006
	return err;
}

3007
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3008
			u16 len)
3009
{
3010
	struct mgmt_cp_confirm_name *cp = data;
3011 3012 3013
	struct inquiry_entry *e;
	int err;

3014
	BT_DBG("%s", hdev->name);
3015 3016 3017

	hci_dev_lock(hdev);

3018
	if (!hci_discovery_active(hdev)) {
3019
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3020
				 MGMT_STATUS_FAILED);
3021 3022 3023
		goto failed;
	}

3024
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3025
	if (!e) {
3026
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3027
				 MGMT_STATUS_INVALID_PARAMS);
3028 3029 3030 3031 3032 3033 3034 3035
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3036
		hci_inquiry_cache_update_resolve(hdev, e);
3037 3038
	}

3039 3040
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3041 3042 3043 3044 3045 3046

failed:
	hci_dev_unlock(hdev);
	return err;
}

3047
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3048
			u16 len)
3049
{
3050
	struct mgmt_cp_block_device *cp = data;
3051
	u8 status;
3052 3053
	int err;

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

3056
	if (!bdaddr_type_is_valid(cp->addr.type))
3057 3058 3059
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3060

3061
	hci_dev_lock(hdev);
3062

3063
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3064
	if (err < 0)
3065
		status = MGMT_STATUS_FAILED;
3066
	else
3067
		status = MGMT_STATUS_SUCCESS;
3068

3069
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3070
			   &cp->addr, sizeof(cp->addr));
3071

3072
	hci_dev_unlock(hdev);
3073 3074 3075 3076

	return err;
}

3077
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3078
			  u16 len)
3079
{
3080
	struct mgmt_cp_unblock_device *cp = data;
3081
	u8 status;
3082 3083
	int err;

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

3086
	if (!bdaddr_type_is_valid(cp->addr.type))
3087 3088 3089
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3090

3091
	hci_dev_lock(hdev);
3092

3093
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3094
	if (err < 0)
3095
		status = MGMT_STATUS_INVALID_PARAMS;
3096
	else
3097
		status = MGMT_STATUS_SUCCESS;
3098

3099
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3100
			   &cp->addr, sizeof(cp->addr));
3101

3102
	hci_dev_unlock(hdev);
3103 3104 3105 3106

	return err;
}

3107 3108 3109 3110
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3111
	struct hci_request req;
3112
	int err;
3113
	__u16 source;
3114 3115 3116

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

3117 3118 3119 3120 3121 3122
	source = __le16_to_cpu(cp->source);

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

3123 3124
	hci_dev_lock(hdev);

3125
	hdev->devid_source = source;
3126 3127 3128 3129 3130 3131
	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);

3132 3133 3134
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3135 3136 3137 3138 3139 3140

	hci_dev_unlock(hdev);

	return err;
}

3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 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
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;
}

3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248
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 {
3249 3250 3251 3252 3253 3254 3255
		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);

3256 3257 3258 3259 3260 3261 3262 3263 3264 3265
		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);
}

3266
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3267
				void *data, u16 len)
3268
{
3269
	struct mgmt_mode *cp = data;
3270 3271
	struct pending_cmd *cmd;
	struct hci_request req;
3272 3273
	int err;

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

3276
	if (!lmp_bredr_capable(hdev) || hdev->hci_ver < BLUETOOTH_VER_1_2)
3277 3278 3279
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3280 3281 3282 3283
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3284
	if (!hdev_is_powered(hdev))
3285
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3286
				  MGMT_STATUS_NOT_POWERED);
3287 3288

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3289
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3290
				  MGMT_STATUS_REJECTED);
3291 3292 3293

	hci_dev_lock(hdev);

3294 3295 3296 3297 3298 3299
	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;
	}

3300 3301 3302 3303 3304 3305
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3306 3307 3308 3309 3310
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3311 3312
	}

3313 3314
	hci_req_init(&req, hdev);

3315
	write_fast_connectable(&req, cp->val);
3316 3317

	err = hci_req_run(&req, fast_connectable_complete);
3318
	if (err < 0) {
3319
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3320
				 MGMT_STATUS_FAILED);
3321
		mgmt_pending_remove(cmd);
3322 3323
	}

3324
unlock:
3325
	hci_dev_unlock(hdev);
3326

3327 3328 3329
	return err;
}

3330 3331
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3332 3333
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3334 3335
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3336 3337
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3338 3339 3340
	return true;
}

3341
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3342
			       void *cp_data, u16 len)
3343 3344 3345
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3346
	int i, err;
3347

3348
	key_count = __le16_to_cpu(cp->key_count);
3349 3350 3351 3352 3353

	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",
3354
		       len, expected_len);
3355
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3356
				  MGMT_STATUS_INVALID_PARAMS);
3357 3358
	}

3359
	BT_DBG("%s key_count %u", hdev->name, key_count);
3360

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

3364
		if (!ltk_is_valid(key))
3365 3366 3367 3368 3369
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382
	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;

3383
		hci_add_ltk(hdev, &key->addr.bdaddr,
3384
			    bdaddr_to_le(key->addr.type),
3385 3386
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3387 3388
	}

3389 3390 3391
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3392 3393
	hci_dev_unlock(hdev);

3394
	return err;
3395 3396
}

3397
static const struct mgmt_handler {
3398 3399
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3400 3401
	bool var_len;
	size_t data_len;
3402 3403
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
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
	{ 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 },
3443
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3444
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3445 3446 3447
};


3448 3449
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3450 3451
	void *buf;
	u8 *cp;
3452
	struct mgmt_hdr *hdr;
3453
	u16 opcode, index, len;
3454
	struct hci_dev *hdev = NULL;
3455
	const struct mgmt_handler *handler;
3456 3457 3458 3459 3460 3461 3462
	int err;

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

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

3463
	buf = kmalloc(msglen, GFP_KERNEL);
3464 3465 3466 3467 3468 3469 3470 3471
	if (!buf)
		return -ENOMEM;

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

3472
	hdr = buf;
3473 3474 3475
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3476 3477 3478 3479 3480 3481

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

3482
	if (index != MGMT_INDEX_NONE) {
3483 3484 3485
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3486
					 MGMT_STATUS_INVALID_INDEX);
3487 3488
			goto done;
		}
3489 3490 3491 3492 3493 3494

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

3497
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3498
	    mgmt_handlers[opcode].func == NULL) {
3499
		BT_DBG("Unknown op %u", opcode);
3500
		err = cmd_status(sk, index, opcode,
3501
				 MGMT_STATUS_UNKNOWN_COMMAND);
3502 3503 3504 3505
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3506
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3507
		err = cmd_status(sk, index, opcode,
3508
				 MGMT_STATUS_INVALID_INDEX);
3509
		goto done;
3510 3511
	}

3512 3513 3514
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3515
	    (!handler->var_len && len != handler->data_len)) {
3516
		err = cmd_status(sk, index, opcode,
3517
				 MGMT_STATUS_INVALID_PARAMS);
3518 3519 3520
		goto done;
	}

3521 3522 3523 3524 3525
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3526
	err = handler->func(sk, hdev, cp, len);
3527 3528 3529
	if (err < 0)
		goto done;

3530 3531 3532
	err = msglen;

done:
3533 3534 3535
	if (hdev)
		hci_dev_put(hdev);

3536 3537 3538
	kfree(buf);
	return err;
}
3539

3540
int mgmt_index_added(struct hci_dev *hdev)
3541
{
3542 3543 3544
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3545
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3546 3547
}

3548
int mgmt_index_removed(struct hci_dev *hdev)
3549
{
3550
	u8 status = MGMT_STATUS_INVALID_INDEX;
3551

3552 3553 3554
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3555
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3556

3557
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3558 3559
}

3560
static void set_bredr_scan(struct hci_request *req)
3561
{
3562
	struct hci_dev *hdev = req->hdev;
3563 3564
	u8 scan = 0;

3565 3566 3567 3568 3569 3570
	/* 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);

3571 3572 3573 3574 3575
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3576 3577
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3578 3579
}

3580 3581 3582 3583 3584 3585 3586 3587 3588 3589 3590 3591 3592 3593 3594 3595 3596 3597
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);
}

3598
static int powered_update_hci(struct hci_dev *hdev)
3599
{
3600
	struct hci_request req;
3601
	u8 link_sec;
3602

3603 3604
	hci_req_init(&req, hdev);

3605 3606 3607
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3608

3609
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3610
	}
3611

3612 3613
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
3614
		struct hci_cp_write_le_host_supported cp;
3615

3616 3617
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3618

3619 3620 3621 3622 3623
		/* 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))
3624 3625
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3626
	}
3627

3628 3629 3630 3631 3632 3633
	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);
	}

3634 3635
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3636 3637
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3638

3639
	if (lmp_bredr_capable(hdev)) {
3640 3641
		set_bredr_scan(&req);
		update_class(&req);
3642
		update_name(&req);
3643
		update_eir(&req);
3644
	}
3645

3646
	return hci_req_run(&req, powered_complete);
3647
}
3648

3649 3650 3651
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3652 3653
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3654
	int err;
3655

3656 3657 3658 3659
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3660 3661
		if (powered_update_hci(hdev) == 0)
			return 0;
3662

3663 3664 3665
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3666 3667
	}

3668 3669 3670 3671 3672 3673 3674 3675
	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:
3676
	err = new_settings(hdev, match.sk);
3677 3678 3679 3680

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

3681
	return err;
3682
}
3683

3684 3685 3686 3687 3688 3689 3690 3691 3692 3693 3694 3695 3696 3697 3698 3699 3700 3701 3702 3703 3704
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;
}

3705
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3706
{
3707
	struct cmd_lookup match = { NULL, hdev };
3708 3709
	bool changed = false;
	int err = 0;
3710

3711 3712 3713 3714 3715 3716 3717
	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;
	}
3718

3719
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3720
			     &match);
3721

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

3725 3726 3727
	if (match.sk)
		sock_put(match.sk);

3728
	return err;
3729
}
3730

3731
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3732
{
3733
	struct pending_cmd *cmd;
3734 3735
	bool changed = false;
	int err = 0;
3736

3737 3738 3739 3740 3741 3742 3743
	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;
	}
3744

3745
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
3746

3747
	if (changed)
3748
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
3749

3750
	return err;
3751
}
3752

3753
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3754
{
3755 3756
	u8 mgmt_err = mgmt_status(status);

3757
	if (scan & SCAN_PAGE)
3758
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3759
				     cmd_status_rsp, &mgmt_err);
3760 3761

	if (scan & SCAN_INQUIRY)
3762
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3763
				     cmd_status_rsp, &mgmt_err);
3764 3765 3766 3767

	return 0;
}

3768 3769
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
3770
{
3771
	struct mgmt_ev_new_link_key ev;
3772

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

3775
	ev.store_hint = persistent;
3776
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3777
	ev.key.addr.type = BDADDR_BREDR;
3778
	ev.key.type = key->type;
3779
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3780
	ev.key.pin_len = key->pin_len;
3781

3782
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3783
}
3784

3785 3786 3787 3788 3789 3790 3791 3792
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);
3793
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3794 3795 3796 3797 3798 3799 3800 3801 3802 3803
	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));

3804 3805
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
3806 3807
}

3808
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3809 3810
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
3811
{
3812 3813 3814
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
3815

3816
	bacpy(&ev->addr.bdaddr, bdaddr);
3817
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3818

3819
	ev->flags = __cpu_to_le32(flags);
3820

3821 3822
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3823
					  name, name_len);
3824 3825

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3826
		eir_len = eir_append_data(ev->eir, eir_len,
3827
					  EIR_CLASS_OF_DEV, dev_class, 3);
3828

3829
	ev->eir_len = cpu_to_le16(eir_len);
3830 3831

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3832
			  sizeof(*ev) + eir_len, NULL);
3833 3834
}

3835 3836
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
3837
	struct mgmt_cp_disconnect *cp = cmd->param;
3838
	struct sock **sk = data;
3839
	struct mgmt_rp_disconnect rp;
3840

3841 3842
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3843

3844
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3845
		     sizeof(rp));
3846 3847 3848 3849

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

3850
	mgmt_pending_remove(cmd);
3851 3852
}

3853
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3854
{
3855
	struct hci_dev *hdev = data;
3856 3857
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
3858 3859

	memset(&rp, 0, sizeof(rp));
3860 3861
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3862

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

3865
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3866 3867 3868 3869

	mgmt_pending_remove(cmd);
}

3870
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
3871
			     u8 link_type, u8 addr_type, u8 reason)
3872
{
3873
	struct mgmt_ev_device_disconnected ev;
3874 3875 3876
	struct sock *sk = NULL;
	int err;

3877
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
3878

3879 3880 3881
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
3882

3883
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
3884
			 sk);
3885 3886

	if (sk)
3887
		sock_put(sk);
3888

3889
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
3890
			     hdev);
3891

3892 3893 3894
	return err;
}

3895
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
3896
			   u8 link_type, u8 addr_type, u8 status)
3897
{
3898
	struct mgmt_rp_disconnect rp;
3899 3900 3901
	struct pending_cmd *cmd;
	int err;

3902 3903 3904
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

3905
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
3906 3907 3908
	if (!cmd)
		return -ENOENT;

3909
	bacpy(&rp.addr.bdaddr, bdaddr);
3910
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
3911

3912
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
3913
			   mgmt_status(status), &rp, sizeof(rp));
3914

3915
	mgmt_pending_remove(cmd);
3916 3917

	return err;
3918
}
3919

3920
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3921
			u8 addr_type, u8 status)
3922 3923 3924
{
	struct mgmt_ev_connect_failed ev;

3925
	bacpy(&ev.addr.bdaddr, bdaddr);
3926
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3927
	ev.status = mgmt_status(status);
3928

3929
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
3930
}
3931

3932
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
3933 3934 3935
{
	struct mgmt_ev_pin_code_request ev;

3936
	bacpy(&ev.addr.bdaddr, bdaddr);
3937
	ev.addr.type = BDADDR_BREDR;
3938
	ev.secure = secure;
3939

3940
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
3941
			  NULL);
3942 3943
}

3944
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3945
				 u8 status)
3946 3947
{
	struct pending_cmd *cmd;
3948
	struct mgmt_rp_pin_code_reply rp;
3949 3950
	int err;

3951
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
3952 3953 3954
	if (!cmd)
		return -ENOENT;

3955
	bacpy(&rp.addr.bdaddr, bdaddr);
3956
	rp.addr.type = BDADDR_BREDR;
3957

3958
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
3959
			   mgmt_status(status), &rp, sizeof(rp));
3960

3961
	mgmt_pending_remove(cmd);
3962 3963 3964 3965

	return err;
}

3966
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
3967
				     u8 status)
3968 3969
{
	struct pending_cmd *cmd;
3970
	struct mgmt_rp_pin_code_reply rp;
3971 3972
	int err;

3973
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
3974 3975 3976
	if (!cmd)
		return -ENOENT;

3977
	bacpy(&rp.addr.bdaddr, bdaddr);
3978
	rp.addr.type = BDADDR_BREDR;
3979

3980
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
3981
			   mgmt_status(status), &rp, sizeof(rp));
3982

3983
	mgmt_pending_remove(cmd);
3984 3985 3986

	return err;
}
3987

3988
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
3989 3990
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
3991 3992 3993
{
	struct mgmt_ev_user_confirm_request ev;

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

3996
	bacpy(&ev.addr.bdaddr, bdaddr);
3997
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
3998
	ev.confirm_hint = confirm_hint;
3999
	ev.value = value;
4000

4001
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4002
			  NULL);
4003 4004
}

4005
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4006
			      u8 link_type, u8 addr_type)
4007 4008 4009 4010 4011
{
	struct mgmt_ev_user_passkey_request ev;

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

4012
	bacpy(&ev.addr.bdaddr, bdaddr);
4013
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4014 4015

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4016
			  NULL);
4017 4018
}

4019
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4020 4021
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4022 4023 4024 4025 4026
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4027
	cmd = mgmt_pending_find(opcode, hdev);
4028 4029 4030
	if (!cmd)
		return -ENOENT;

4031
	bacpy(&rp.addr.bdaddr, bdaddr);
4032
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4033
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4034
			   &rp, sizeof(rp));
4035

4036
	mgmt_pending_remove(cmd);
4037 4038 4039 4040

	return err;
}

4041
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4042
				     u8 link_type, u8 addr_type, u8 status)
4043
{
4044
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4045
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4046 4047
}

4048
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4049
					 u8 link_type, u8 addr_type, u8 status)
4050
{
4051
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4052 4053
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4054
}
4055

4056
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4057
				     u8 link_type, u8 addr_type, u8 status)
4058
{
4059
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4060
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4061 4062
}

4063
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4064
					 u8 link_type, u8 addr_type, u8 status)
4065
{
4066
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4067 4068
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4069 4070
}

4071 4072 4073 4074 4075 4076 4077 4078 4079 4080 4081 4082 4083 4084 4085 4086
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);
}

4087
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4088
		     u8 addr_type, u8 status)
4089 4090 4091
{
	struct mgmt_ev_auth_failed ev;

4092
	bacpy(&ev.addr.bdaddr, bdaddr);
4093
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4094
	ev.status = mgmt_status(status);
4095

4096
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4097
}
4098

4099 4100 4101
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4102 4103
	bool changed = false;
	int err = 0;
4104 4105 4106 4107

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4108
				     cmd_status_rsp, &mgmt_err);
4109 4110 4111
		return 0;
	}

4112 4113 4114 4115 4116 4117 4118 4119
	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;
	}

4120
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4121
			     &match);
4122

4123 4124
	if (changed)
		err = new_settings(hdev, match.sk);
4125 4126 4127 4128 4129 4130 4131

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

	return err;
}

4132
static void clear_eir(struct hci_request *req)
4133
{
4134
	struct hci_dev *hdev = req->hdev;
4135 4136
	struct hci_cp_write_eir cp;

4137
	if (!lmp_ext_inq_capable(hdev))
4138
		return;
4139

4140 4141
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4144
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4145 4146
}

4147
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4148 4149
{
	struct cmd_lookup match = { NULL, hdev };
4150
	struct hci_request req;
4151 4152
	bool changed = false;
	int err = 0;
4153 4154 4155

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4158
						 &hdev->dev_flags))
4159 4160
			err = new_settings(hdev, NULL);

4161 4162
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4163 4164 4165 4166 4167 4168 4169 4170 4171 4172

		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;
4173 4174 4175 4176
	}

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

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

4180
	if (match.sk)
4181 4182
		sock_put(match.sk);

4183 4184
	hci_req_init(&req, hdev);

4185
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4186
		update_eir(&req);
4187
	else
4188 4189 4190
		clear_eir(&req);

	hci_req_run(&req, NULL);
4191

4192 4193 4194
	return err;
}

4195
static void sk_lookup(struct pending_cmd *cmd, void *data)
4196 4197 4198 4199 4200 4201 4202 4203 4204
{
	struct cmd_lookup *match = data;

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

4205
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4206
				   u8 status)
4207
{
4208 4209
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4210

4211 4212 4213
	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);
4214 4215

	if (!status)
4216 4217
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4218 4219 4220

	if (match.sk)
		sock_put(match.sk);
4221 4222 4223 4224

	return err;
}

4225
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4226 4227
{
	struct mgmt_cp_set_local_name ev;
4228
	struct pending_cmd *cmd;
4229

4230 4231
	if (status)
		return 0;
4232 4233 4234

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

4237
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4238 4239
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4240

4241 4242 4243 4244 4245
		/* 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;
4246
	}
4247

4248 4249
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4250
}
4251

4252
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4253
					    u8 *randomizer, u8 status)
4254 4255 4256 4257
{
	struct pending_cmd *cmd;
	int err;

4258
	BT_DBG("%s status %u", hdev->name, status);
4259

4260
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4261 4262 4263 4264
	if (!cmd)
		return -ENOENT;

	if (status) {
4265 4266
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4267 4268 4269 4270 4271 4272
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4273
		err = cmd_complete(cmd->sk, hdev->id,
4274 4275
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4276 4277 4278 4279 4280 4281
	}

	mgmt_pending_remove(cmd);

	return err;
}
4282

4283
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4284 4285
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
4286
{
4287 4288
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4289
	size_t ev_size;
4290

4291 4292 4293
	if (!hci_discovery_active(hdev))
		return -EPERM;

4294 4295
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4296 4297
		return -EINVAL;

4298 4299
	memset(buf, 0, sizeof(buf));

4300
	bacpy(&ev->addr.bdaddr, bdaddr);
4301
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4302
	ev->rssi = rssi;
4303
	if (cfm_name)
4304
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4305
	if (!ssp)
4306
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4307

4308
	if (eir_len > 0)
4309
		memcpy(ev->eir, eir, eir_len);
4310

4311 4312
	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,
4313
					  dev_class, 3);
4314

4315
	ev->eir_len = cpu_to_le16(eir_len);
4316
	ev_size = sizeof(*ev) + eir_len;
4317

4318
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4319
}
4320

4321
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4322
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4323
{
4324 4325 4326
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4327

4328
	ev = (struct mgmt_ev_device_found *) buf;
4329

4330 4331 4332
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4333
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4334 4335 4336
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4337
				  name_len);
4338

4339
	ev->eir_len = cpu_to_le16(eir_len);
4340

4341
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
4342
			  sizeof(*ev) + eir_len, NULL);
4343
}
4344

4345
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4346
{
4347
	struct mgmt_ev_discovering ev;
4348 4349
	struct pending_cmd *cmd;

4350 4351
	BT_DBG("%s discovering %u", hdev->name, discovering);

4352
	if (discovering)
4353
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4354
	else
4355
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4356 4357

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

4360 4361
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4362 4363 4364
		mgmt_pending_remove(cmd);
	}

4365 4366 4367 4368 4369
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4370
}
4371

4372
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4373 4374 4375 4376
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4377
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4378

4379 4380
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4381

4382
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4383
			  cmd ? cmd->sk : NULL);
4384 4385
}

4386
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4387 4388 4389 4390
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4391
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4392

4393 4394
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4395

4396
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4397
			  cmd ? cmd->sk : NULL);
4398
}
4399 4400 4401

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