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

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

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

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

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

/* Bluetooth HCI Management interface */

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

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

35
#define MGMT_VERSION	1
36
#define MGMT_REVISION	3
37

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

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

105
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
106

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

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

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

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

189 190 191 192 193 194 195 196
static u8 mgmt_status(u8 hci_status)
{
	if (hci_status < ARRAY_SIZE(mgmt_status_table))
		return mgmt_status_table[hci_status];

	return MGMT_STATUS_FAILED;
}

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

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

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

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

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

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

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

224
	return err;
225 226
}

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

258
	return err;
259 260
}

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

	BT_DBG("sock %p", sk);

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

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

275 276
static int read_commands(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 data_len)
277 278
{
	struct mgmt_rp_read_commands *rp;
279 280
	const u16 num_commands = ARRAY_SIZE(mgmt_commands);
	const u16 num_events = ARRAY_SIZE(mgmt_events);
281
	__le16 *opcode;
282 283 284 285 286 287 288 289 290 291 292
	size_t rp_size;
	int i, err;

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

	return err;
}

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

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

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

327 328 329
		count++;
	}

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

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

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

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

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

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

355 356
	read_unlock(&hci_dev_list_lock);

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

360 361 362
	kfree(rp);

	return err;
363 364
}

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

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

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

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

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

	return settings;
}

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

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

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

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

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

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

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

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

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

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

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

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

430 431 432
	return settings;
}

433 434
#define PNP_INFO_SVCLASS_ID		0x1200

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

	if (len < 4)
		return ptr;

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

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

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

		if (uuid16 == PNP_INFO_SVCLASS_ID)
			continue;

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

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

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

	return ptr;
}

477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509
static u8 *create_uuid32_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 6)
		return ptr;

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

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

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

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

	return ptr;
}

510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542
static u8 *create_uuid128_list(struct hci_dev *hdev, u8 *data, ptrdiff_t len)
{
	u8 *ptr = data, *uuids_start = NULL;
	struct bt_uuid *uuid;

	if (len < 18)
		return ptr;

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

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

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

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

	return ptr;
}

543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565
static void create_eir(struct hci_dev *hdev, u8 *data)
{
	u8 *ptr = data;
	size_t name_len;

	name_len = strlen(hdev->dev_name);

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

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

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

		ptr += (name_len + 2);
	}

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

		ptr += 3;
	}

574 575 576 577 578 579 580 581 582 583 584 585
	if (hdev->devid_source > 0) {
		ptr[0] = 9;
		ptr[1] = EIR_DEVICE_ID;

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

		ptr += 10;
	}

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

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

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

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

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

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

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

	create_eir(hdev, cp.data);

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

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

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

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

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

	return val;
}

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

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

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

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

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

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

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

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

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

663 664
	hci_req_init(&req, hdev);

665 666
	hci_dev_lock(hdev);

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

	hci_dev_unlock(hdev);
671 672

	hci_req_run(&req, NULL);
673 674
}

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

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

682 683 684 685 686 687
	/* Non-mgmt controlled devices get this bit set
	 * implicitly so that pairing works for them, however
	 * for mgmt we require user-space to explicitly enable
	 * it
	 */
	clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
688 689
}

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

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

697
	hci_dev_lock(hdev);
698

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

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

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

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

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

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

714
	hci_dev_unlock(hdev);
715

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

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

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

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

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

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

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

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

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

754
	return cmd;
755 756
}

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

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

		cb(cmd, data);
	}
}

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

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

	return NULL;
}

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

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

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

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

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

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

811
	hci_dev_lock(hdev);
812

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

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

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

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

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

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

846
	err = 0;
847 848

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

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

859
	skb = alloc_skb(sizeof(*hdr) + data_len, GFP_KERNEL);
860 861 862 863 864 865 866 867
	if (!skb)
		return -ENOMEM;

	hdr = (void *) skb_put(skb, sizeof(*hdr));
	hdr->opcode = cpu_to_le16(event);
	if (hdev)
		hdr->index = cpu_to_le16(hdev->id);
	else
868
		hdr->index = __constant_cpu_to_le16(MGMT_INDEX_NONE);
869 870 871 872 873
	hdr->len = cpu_to_le16(data_len);

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

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

877 878 879 880 881 882 883 884 885 886 887 888 889 890 891
	hci_send_to_control(skb, skip_sk);
	kfree_skb(skb);

	return 0;
}

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

	ev = cpu_to_le32(get_current_settings(hdev));

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

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

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

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

	list_del(&cmd->list);

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

	mgmt_pending_free(cmd);
}

static void cmd_status_rsp(struct pending_cmd *cmd, void *data)
{
	u8 *status = data;

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

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

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

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

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

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

946
	hci_dev_lock(hdev);
947

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

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

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

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

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

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

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

982 983 984 985
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
986 987 988 989 990 991 992 993 994 995 996
		if (hdev->discov_timeout > 0) {
			cancel_delayed_work(&hdev->discov_off);
			hdev->discov_timeout = 0;
		}

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

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

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

	scan = SCAN_PAGE;

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

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

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

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

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

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

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

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

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

	acp.window = __constant_cpu_to_le16(0x0012);

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

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

1058 1059 1060 1061 1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075 1076 1077
static void set_connectable_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

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

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

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

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

1097
	hci_dev_lock(hdev);
1098

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

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

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

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

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

1119 1120 1121
		goto failed;
	}

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

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

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

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

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

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

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

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

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

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

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

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

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

1184
	hci_dev_lock(hdev);
1185 1186

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

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

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

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

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

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

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

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

1220 1221
	hci_dev_lock(hdev);

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

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1226
					  &hdev->dev_flags)) {
1227 1228 1229 1230 1231 1232 1233 1234 1235 1236 1237
			change_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
			changed = true;
		}

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

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

1238 1239 1240 1241
		goto failed;
	}

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

	val = !!cp->val;

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

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

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

failed:
	hci_dev_unlock(hdev);
	return err;
}

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

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

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

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

1288
	hci_dev_lock(hdev);
1289

1290 1291
	val = !!cp->val;

1292
	if (!hdev_is_powered(hdev)) {
1293 1294 1295 1296 1297 1298 1299 1300 1301 1302 1303 1304 1305 1306
		bool changed = false;

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

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

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

1307 1308 1309 1310
		goto failed;
	}

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

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

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

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

failed:
	hci_dev_unlock(hdev);
	return err;
}

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

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

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

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

1354 1355
	hci_dev_lock(hdev);

1356
	if (cp->val)
1357
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1358
	else
1359 1360 1361 1362 1363 1364 1365 1366
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);

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

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

1368 1369 1370
unlock:
	hci_dev_unlock(hdev);
	return err;
1371 1372
}

1373 1374 1375 1376 1377 1378 1379 1380 1381 1382 1383 1384 1385 1386 1387 1388 1389 1390 1391 1392
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);
}

1393
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1394 1395 1396 1397
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1398
	struct hci_request req;
1399
	int err;
1400
	u8 val, enabled;
1401

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

1404 1405 1406
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1407

1408 1409 1410 1411
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1412
	/* LE-only devices do not allow toggling LE on/off */
1413
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1414 1415 1416
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1417
	hci_dev_lock(hdev);
1418 1419

	val = !!cp->val;
1420
	enabled = lmp_host_le_capable(hdev);
1421

1422
	if (!hdev_is_powered(hdev) || val == enabled) {
1423 1424 1425 1426 1427 1428 1429
		bool changed = false;

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

1430 1431 1432 1433 1434
		if (!val && test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags)) {
			clear_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags);
			changed = true;
		}

1435 1436
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1437
			goto unlock;
1438 1439 1440 1441

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

1442
		goto unlock;
1443 1444
	}

1445 1446
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1447
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1448
				 MGMT_STATUS_BUSY);
1449
		goto unlock;
1450 1451 1452 1453 1454
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1455
		goto unlock;
1456 1457 1458 1459 1460 1461
	}

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

	if (val) {
		hci_cp.le = val;
1462
		hci_cp.simul = lmp_le_br_capable(hdev);
1463 1464
	}

1465 1466
	hci_req_init(&req, hdev);

1467 1468 1469
	if (test_bit(HCI_LE_PERIPHERAL, &hdev->dev_flags) && !val)
		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

1470 1471 1472 1473
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1474
	if (err < 0)
1475 1476
		mgmt_pending_remove(cmd);

1477 1478
unlock:
	hci_dev_unlock(hdev);
1479 1480 1481
	return err;
}

1482 1483 1484 1485 1486 1487 1488 1489 1490 1491 1492 1493 1494 1495 1496 1497 1498 1499 1500 1501 1502 1503 1504
/* 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;
}

1505 1506 1507 1508 1509 1510 1511 1512 1513 1514 1515 1516 1517 1518 1519 1520 1521 1522 1523
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;
}

1524 1525 1526 1527 1528 1529 1530 1531 1532 1533 1534 1535 1536 1537 1538 1539 1540 1541 1542 1543 1544 1545 1546 1547 1548 1549
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);
}

1550
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1551
{
1552
	struct mgmt_cp_add_uuid *cp = data;
1553
	struct pending_cmd *cmd;
1554
	struct hci_request req;
1555 1556 1557
	struct bt_uuid *uuid;
	int err;

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

1560
	hci_dev_lock(hdev);
1561

1562
	if (pending_eir_or_class(hdev)) {
1563
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1564
				 MGMT_STATUS_BUSY);
1565 1566 1567
		goto failed;
	}

1568
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1569 1570 1571 1572 1573 1574
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1575
	uuid->svc_hint = cp->svc_hint;
1576
	uuid->size = get_uuid_size(cp->uuid);
1577

1578
	list_add_tail(&uuid->list, &hdev->uuids);
1579

1580
	hci_req_init(&req, hdev);
1581

1582 1583 1584
	update_class(&req);
	update_eir(&req);

1585 1586 1587 1588
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1589

1590
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1591
				   hdev->dev_class, 3);
1592 1593 1594 1595
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1596
	if (!cmd) {
1597
		err = -ENOMEM;
1598 1599 1600 1601
		goto failed;
	}

	err = 0;
1602 1603

failed:
1604
	hci_dev_unlock(hdev);
1605 1606 1607
	return err;
}

1608 1609 1610 1611 1612 1613
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)) {
1614 1615
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1616 1617 1618 1619 1620 1621
		return true;
	}

	return false;
}

1622 1623 1624 1625 1626 1627 1628
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);
}

1629
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1630
		       u16 len)
1631
{
1632
	struct mgmt_cp_remove_uuid *cp = data;
1633
	struct pending_cmd *cmd;
1634
	struct bt_uuid *match, *tmp;
1635
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1636
	struct hci_request req;
1637 1638
	int err, found;

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

1641
	hci_dev_lock(hdev);
1642

1643
	if (pending_eir_or_class(hdev)) {
1644
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1645
				 MGMT_STATUS_BUSY);
1646 1647 1648
		goto unlock;
	}

1649 1650
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1651

1652
		if (enable_service_cache(hdev)) {
1653
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1654
					   0, hdev->dev_class, 3);
1655 1656
			goto unlock;
		}
1657

1658
		goto update_class;
1659 1660 1661 1662
	}

	found = 0;

1663
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1664 1665 1666 1667
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1668
		kfree(match);
1669 1670 1671 1672
		found++;
	}

	if (found == 0) {
1673
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1674
				 MGMT_STATUS_INVALID_PARAMS);
1675 1676 1677
		goto unlock;
	}

1678
update_class:
1679
	hci_req_init(&req, hdev);
1680

1681 1682 1683
	update_class(&req);
	update_eir(&req);

1684 1685 1686 1687
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1688

1689
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1690
				   hdev->dev_class, 3);
1691 1692 1693 1694
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1695
	if (!cmd) {
1696
		err = -ENOMEM;
1697 1698 1699 1700
		goto unlock;
	}

	err = 0;
1701 1702

unlock:
1703
	hci_dev_unlock(hdev);
1704 1705 1706
	return err;
}

1707 1708 1709 1710 1711 1712 1713
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);
}

1714
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1715
			 u16 len)
1716
{
1717
	struct mgmt_cp_set_dev_class *cp = data;
1718
	struct pending_cmd *cmd;
1719
	struct hci_request req;
1720 1721
	int err;

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

1724
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1725 1726
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1727

1728
	hci_dev_lock(hdev);
1729

1730 1731 1732 1733 1734
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1735

1736 1737 1738 1739 1740
	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;
	}
1741

1742 1743 1744
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1745
	if (!hdev_is_powered(hdev)) {
1746
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1747
				   hdev->dev_class, 3);
1748 1749 1750
		goto unlock;
	}

1751 1752
	hci_req_init(&req, hdev);

1753
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1754 1755 1756
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1757
		update_eir(&req);
1758
	}
1759

1760 1761
	update_class(&req);

1762 1763 1764 1765
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1766

1767
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1768
				   hdev->dev_class, 3);
1769 1770 1771 1772
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1773
	if (!cmd) {
1774
		err = -ENOMEM;
1775 1776 1777 1778
		goto unlock;
	}

	err = 0;
1779

1780
unlock:
1781
	hci_dev_unlock(hdev);
1782 1783 1784
	return err;
}

1785
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1786
			  u16 len)
1787
{
1788
	struct mgmt_cp_load_link_keys *cp = data;
1789
	u16 key_count, expected_len;
1790
	int i;
1791

1792
	key_count = __le16_to_cpu(cp->key_count);
1793

1794 1795
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1796
	if (expected_len != len) {
1797
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1798
		       len, expected_len);
1799
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1800
				  MGMT_STATUS_INVALID_PARAMS);
1801 1802
	}

1803 1804 1805 1806
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1807
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1808
	       key_count);
1809

1810 1811 1812 1813 1814 1815 1816 1817
	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);
	}

1818
	hci_dev_lock(hdev);
1819 1820 1821 1822

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
1823
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1824
	else
1825
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1826

1827
	for (i = 0; i < key_count; i++) {
1828
		struct mgmt_link_key_info *key = &cp->keys[i];
1829

1830
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1831
				 key->type, key->pin_len);
1832 1833
	}

1834
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1835

1836
	hci_dev_unlock(hdev);
1837

1838
	return 0;
1839 1840
}

1841
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1842
			   u8 addr_type, struct sock *skip_sk)
1843 1844 1845 1846 1847 1848 1849
{
	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),
1850
			  skip_sk);
1851 1852
}

1853
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1854
			 u16 len)
1855
{
1856 1857
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1858 1859
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1860 1861 1862
	struct hci_conn *conn;
	int err;

1863
	memset(&rp, 0, sizeof(rp));
1864 1865
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1866

1867 1868 1869 1870 1871
	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));

1872 1873 1874 1875 1876
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1877 1878
	hci_dev_lock(hdev);

1879
	if (!hdev_is_powered(hdev)) {
1880
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1881
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1882 1883 1884
		goto unlock;
	}

1885
	if (cp->addr.type == BDADDR_BREDR)
1886 1887 1888
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1889

1890
	if (err < 0) {
1891
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1892
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1893 1894 1895
		goto unlock;
	}

1896
	if (cp->disconnect) {
1897
		if (cp->addr.type == BDADDR_BREDR)
1898
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1899
						       &cp->addr.bdaddr);
1900 1901
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1902
						       &cp->addr.bdaddr);
1903 1904 1905
	} else {
		conn = NULL;
	}
1906

1907
	if (!conn) {
1908
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1909
				   &rp, sizeof(rp));
1910
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1911 1912
		goto unlock;
	}
1913

1914
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1915
			       sizeof(*cp));
1916 1917 1918
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1919 1920
	}

1921
	dc.handle = cpu_to_le16(conn->handle);
1922 1923 1924 1925 1926
	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);

1927
unlock:
1928
	hci_dev_unlock(hdev);
1929 1930 1931
	return err;
}

1932
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1933
		      u16 len)
1934
{
1935
	struct mgmt_cp_disconnect *cp = data;
1936
	struct mgmt_rp_disconnect rp;
1937
	struct hci_cp_disconnect dc;
1938
	struct pending_cmd *cmd;
1939 1940 1941 1942 1943
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1944 1945 1946 1947
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1948
	if (!bdaddr_type_is_valid(cp->addr.type))
1949 1950 1951
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1952

1953
	hci_dev_lock(hdev);
1954 1955

	if (!test_bit(HCI_UP, &hdev->flags)) {
1956 1957
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1958 1959 1960
		goto failed;
	}

1961
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
1962 1963
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
1964 1965 1966
		goto failed;
	}

1967
	if (cp->addr.type == BDADDR_BREDR)
1968 1969
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
1970 1971
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
1972

1973
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
1974 1975
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
1976 1977 1978
		goto failed;
	}

1979
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
1980 1981
	if (!cmd) {
		err = -ENOMEM;
1982
		goto failed;
1983
	}
1984

1985
	dc.handle = cpu_to_le16(conn->handle);
1986
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
1987 1988 1989

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
1990
		mgmt_pending_remove(cmd);
1991 1992

failed:
1993
	hci_dev_unlock(hdev);
1994 1995 1996
	return err;
}

1997
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
1998 1999 2000
{
	switch (link_type) {
	case LE_LINK:
2001 2002
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2003
			return BDADDR_LE_PUBLIC;
2004

2005
		default:
2006
			/* Fallback to LE Random address type */
2007
			return BDADDR_LE_RANDOM;
2008
		}
2009

2010
	default:
2011
		/* Fallback to BR/EDR type */
2012
		return BDADDR_BREDR;
2013 2014 2015
	}
}

2016 2017
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2018 2019
{
	struct mgmt_rp_get_connections *rp;
2020
	struct hci_conn *c;
2021
	size_t rp_len;
2022 2023
	int err;
	u16 i;
2024 2025 2026

	BT_DBG("");

2027
	hci_dev_lock(hdev);
2028

2029
	if (!hdev_is_powered(hdev)) {
2030
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2031
				 MGMT_STATUS_NOT_POWERED);
2032 2033 2034
		goto unlock;
	}

2035
	i = 0;
2036 2037
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2038
			i++;
2039 2040
	}

2041
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2042
	rp = kmalloc(rp_len, GFP_KERNEL);
2043
	if (!rp) {
2044 2045 2046 2047 2048
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2049
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2050 2051
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2052
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2053
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2054
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2055 2056 2057 2058
			continue;
		i++;
	}

2059
	rp->conn_count = cpu_to_le16(i);
2060

2061 2062
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2063

2064
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2065
			   rp_len);
2066

2067
	kfree(rp);
2068 2069

unlock:
2070
	hci_dev_unlock(hdev);
2071 2072 2073
	return err;
}

2074
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2075
				   struct mgmt_cp_pin_code_neg_reply *cp)
2076 2077 2078 2079
{
	struct pending_cmd *cmd;
	int err;

2080
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2081
			       sizeof(*cp));
2082 2083 2084
	if (!cmd)
		return -ENOMEM;

2085
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2086
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2087 2088 2089 2090 2091 2092
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2093
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2094
			  u16 len)
2095
{
2096
	struct hci_conn *conn;
2097
	struct mgmt_cp_pin_code_reply *cp = data;
2098
	struct hci_cp_pin_code_reply reply;
2099
	struct pending_cmd *cmd;
2100 2101 2102 2103
	int err;

	BT_DBG("");

2104
	hci_dev_lock(hdev);
2105

2106
	if (!hdev_is_powered(hdev)) {
2107
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2108
				 MGMT_STATUS_NOT_POWERED);
2109 2110 2111
		goto failed;
	}

2112
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2113
	if (!conn) {
2114
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2115
				 MGMT_STATUS_NOT_CONNECTED);
2116 2117 2118 2119
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2120 2121 2122
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2123 2124 2125

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

2126
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2127
		if (err >= 0)
2128
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2129
					 MGMT_STATUS_INVALID_PARAMS);
2130 2131 2132 2133

		goto failed;
	}

2134
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2135 2136
	if (!cmd) {
		err = -ENOMEM;
2137
		goto failed;
2138
	}
2139

2140
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2141
	reply.pin_len = cp->pin_len;
2142
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2143 2144 2145

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2146
		mgmt_pending_remove(cmd);
2147 2148

failed:
2149
	hci_dev_unlock(hdev);
2150 2151 2152
	return err;
}

2153 2154
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2155
{
2156
	struct mgmt_cp_set_io_capability *cp = data;
2157 2158 2159

	BT_DBG("");

2160
	hci_dev_lock(hdev);
2161 2162 2163 2164

	hdev->io_capability = cp->io_capability;

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

2167
	hci_dev_unlock(hdev);
2168

2169 2170
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2171 2172
}

2173
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2174 2175
{
	struct hci_dev *hdev = conn->hdev;
2176
	struct pending_cmd *cmd;
2177

2178
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2179 2180 2181 2182 2183 2184 2185 2186 2187 2188 2189 2190 2191 2192 2193 2194 2195
		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;

2196
	bacpy(&rp.addr.bdaddr, &conn->dst);
2197
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2198

2199
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2200
		     &rp, sizeof(rp));
2201 2202 2203 2204 2205 2206

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

2207
	hci_conn_drop(conn);
2208

2209
	mgmt_pending_remove(cmd);
2210 2211 2212 2213 2214 2215 2216 2217 2218
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2219
	if (!cmd)
2220
		BT_DBG("Unable to find a pending command");
2221
	else
2222
		pairing_complete(cmd, mgmt_status(status));
2223 2224
}

2225 2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240
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));
}

2241
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2242
		       u16 len)
2243
{
2244
	struct mgmt_cp_pair_device *cp = data;
2245
	struct mgmt_rp_pair_device rp;
2246 2247 2248 2249 2250 2251 2252
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2253 2254 2255 2256
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2257 2258 2259 2260 2261
	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));

2262
	hci_dev_lock(hdev);
2263

2264
	if (!hdev_is_powered(hdev)) {
2265 2266
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2267 2268 2269
		goto unlock;
	}

2270 2271
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2272
		auth_type = HCI_AT_DEDICATED_BONDING;
2273
	else
2274 2275
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2276
	if (cp->addr.type == BDADDR_BREDR)
2277 2278
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2279
	else
2280 2281
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2282

2283
	if (IS_ERR(conn)) {
2284 2285 2286 2287 2288 2289 2290
		int status;

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

2291
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2292
				   status, &rp,
2293
				   sizeof(rp));
2294 2295 2296 2297
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2298
		hci_conn_drop(conn);
2299
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2300
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2301 2302 2303
		goto unlock;
	}

2304
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2305 2306
	if (!cmd) {
		err = -ENOMEM;
2307
		hci_conn_drop(conn);
2308 2309 2310
		goto unlock;
	}

2311
	/* For LE, just connecting isn't a proof that the pairing finished */
2312
	if (cp->addr.type == BDADDR_BREDR)
2313
		conn->connect_cfm_cb = pairing_complete_cb;
2314 2315
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2316

2317 2318 2319 2320 2321 2322
	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 &&
2323
	    hci_conn_security(conn, sec_level, auth_type))
2324 2325 2326 2327 2328
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2329
	hci_dev_unlock(hdev);
2330 2331 2332
	return err;
}

2333 2334
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2335
{
2336
	struct mgmt_addr_info *addr = data;
2337 2338 2339 2340 2341 2342 2343 2344
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2345
	if (!hdev_is_powered(hdev)) {
2346
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2347
				 MGMT_STATUS_NOT_POWERED);
2348 2349 2350
		goto unlock;
	}

2351 2352
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2353
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2354
				 MGMT_STATUS_INVALID_PARAMS);
2355 2356 2357 2358 2359 2360
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2361
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2362
				 MGMT_STATUS_INVALID_PARAMS);
2363 2364 2365 2366 2367
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2368
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2369
			   addr, sizeof(*addr));
2370 2371 2372 2373 2374
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2375
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2376
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2377
			     u16 hci_op, __le32 passkey)
2378 2379
{
	struct pending_cmd *cmd;
2380
	struct hci_conn *conn;
2381 2382
	int err;

2383
	hci_dev_lock(hdev);
2384

2385
	if (!hdev_is_powered(hdev)) {
2386 2387 2388
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2389
		goto done;
2390 2391
	}

2392 2393
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2394
	else
2395
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2396 2397

	if (!conn) {
2398 2399 2400
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2401 2402
		goto done;
	}
2403

2404
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2405
		/* Continue with pairing via SMP */
2406 2407 2408
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2409 2410 2411
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2412
		else
2413 2414 2415
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2416 2417 2418 2419

		goto done;
	}

2420
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2421 2422
	if (!cmd) {
		err = -ENOMEM;
2423
		goto done;
2424 2425
	}

2426
	/* Continue with pairing via HCI */
2427 2428 2429
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2430
		bacpy(&cp.bdaddr, &addr->bdaddr);
2431 2432 2433
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2434 2435
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2436

2437 2438
	if (err < 0)
		mgmt_pending_remove(cmd);
2439

2440
done:
2441
	hci_dev_unlock(hdev);
2442 2443 2444
	return err;
}

2445 2446 2447 2448 2449 2450 2451
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("");

2452
	return user_pairing_resp(sk, hdev, &cp->addr,
2453 2454 2455 2456
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

2457 2458
static int user_confirm_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2459
{
2460
	struct mgmt_cp_user_confirm_reply *cp = data;
2461 2462 2463 2464

	BT_DBG("");

	if (len != sizeof(*cp))
2465
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2466
				  MGMT_STATUS_INVALID_PARAMS);
2467

2468
	return user_pairing_resp(sk, hdev, &cp->addr,
2469 2470
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2471 2472
}

2473
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2474
				  void *data, u16 len)
2475
{
2476
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2477 2478 2479

	BT_DBG("");

2480
	return user_pairing_resp(sk, hdev, &cp->addr,
2481 2482
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2483 2484
}

2485 2486
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2487
{
2488
	struct mgmt_cp_user_passkey_reply *cp = data;
2489 2490 2491

	BT_DBG("");

2492
	return user_pairing_resp(sk, hdev, &cp->addr,
2493 2494
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2495 2496
}

2497
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2498
				  void *data, u16 len)
2499
{
2500
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2501 2502 2503

	BT_DBG("");

2504
	return user_pairing_resp(sk, hdev, &cp->addr,
2505 2506
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2507 2508
}

2509
static void update_name(struct hci_request *req)
2510
{
2511
	struct hci_dev *hdev = req->hdev;
2512 2513
	struct hci_cp_write_local_name cp;

2514
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2515

2516
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2517 2518
}

2519 2520 2521 2522 2523 2524 2525 2526 2527 2528 2529 2530 2531 2532 2533 2534 2535 2536 2537 2538 2539 2540 2541 2542 2543 2544 2545 2546
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);
}

2547
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2548
			  u16 len)
2549
{
2550
	struct mgmt_cp_set_local_name *cp = data;
2551
	struct pending_cmd *cmd;
2552
	struct hci_request req;
2553 2554 2555 2556
	int err;

	BT_DBG("");

2557
	hci_dev_lock(hdev);
2558

2559 2560 2561 2562 2563 2564 2565 2566 2567 2568 2569
	/* 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;
	}

2570
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2571

2572
	if (!hdev_is_powered(hdev)) {
2573
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2574 2575

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2576
				   data, len);
2577 2578 2579 2580
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2581
				 sk);
2582

2583 2584 2585
		goto failed;
	}

2586
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2587 2588 2589 2590 2591
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2592 2593
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2594
	hci_req_init(&req, hdev);
2595 2596 2597 2598 2599 2600 2601 2602 2603

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

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

2604
	err = hci_req_run(&req, set_name_complete);
2605 2606 2607 2608
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2609
	hci_dev_unlock(hdev);
2610 2611 2612
	return err;
}

2613
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2614
			       void *data, u16 data_len)
2615 2616 2617 2618
{
	struct pending_cmd *cmd;
	int err;

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

2621
	hci_dev_lock(hdev);
2622

2623
	if (!hdev_is_powered(hdev)) {
2624
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2625
				 MGMT_STATUS_NOT_POWERED);
2626 2627 2628
		goto unlock;
	}

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

2635
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2636
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2637
				 MGMT_STATUS_BUSY);
2638 2639 2640
		goto unlock;
	}

2641
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2642 2643 2644 2645 2646 2647 2648 2649 2650 2651
	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:
2652
	hci_dev_unlock(hdev);
2653 2654 2655
	return err;
}

2656
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2657
			       void *data, u16 len)
2658
{
2659
	struct mgmt_cp_add_remote_oob_data *cp = data;
2660
	u8 status;
2661 2662
	int err;

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

2665
	hci_dev_lock(hdev);
2666

2667
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2668
				      cp->randomizer);
2669
	if (err < 0)
2670
		status = MGMT_STATUS_FAILED;
2671
	else
2672
		status = MGMT_STATUS_SUCCESS;
2673

2674
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2675
			   &cp->addr, sizeof(cp->addr));
2676

2677
	hci_dev_unlock(hdev);
2678 2679 2680
	return err;
}

2681
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2682
				  void *data, u16 len)
2683
{
2684
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2685
	u8 status;
2686 2687
	int err;

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

2690
	hci_dev_lock(hdev);
2691

2692
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2693
	if (err < 0)
2694
		status = MGMT_STATUS_INVALID_PARAMS;
2695
	else
2696
		status = MGMT_STATUS_SUCCESS;
2697

2698
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2699
			   status, &cp->addr, sizeof(cp->addr));
2700

2701
	hci_dev_unlock(hdev);
2702 2703 2704
	return err;
}

2705 2706 2707 2708 2709 2710 2711 2712 2713 2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725
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;
}

2726 2727 2728 2729 2730 2731 2732 2733 2734 2735 2736 2737 2738 2739 2740 2741 2742 2743
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,
2744
				   DISCOV_LE_TIMEOUT);
2745 2746 2747 2748
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2749
				   DISCOV_INTERLEAVED_TIMEOUT);
2750 2751 2752 2753 2754 2755 2756 2757 2758 2759
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

2760
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2761
			   void *data, u16 len)
2762
{
2763
	struct mgmt_cp_start_discovery *cp = data;
2764
	struct pending_cmd *cmd;
2765 2766 2767 2768 2769 2770
	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 };
2771 2772
	int err;

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

2775
	hci_dev_lock(hdev);
2776

2777
	if (!hdev_is_powered(hdev)) {
2778
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2779
				 MGMT_STATUS_NOT_POWERED);
2780 2781 2782
		goto failed;
	}

2783 2784 2785 2786 2787 2788
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2789
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2790
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2791
				 MGMT_STATUS_BUSY);
2792 2793 2794
		goto failed;
	}

2795
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2796 2797 2798 2799 2800
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2801 2802
	hdev->discovery.type = cp->type;

2803 2804
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
2805
	switch (hdev->discovery.type) {
2806
	case DISCOV_TYPE_BREDR:
2807
		if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2808 2809 2810 2811 2812 2813
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2814 2815 2816 2817 2818 2819 2820 2821 2822 2823 2824
		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));
2825
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
2826
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
2827 2828 2829
		break;

	case DISCOV_TYPE_LE:
2830
	case DISCOV_TYPE_INTERLEAVED:
2831
		if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags)) {
2832 2833 2834 2835 2836 2837
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2838
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
2839
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2840 2841 2842 2843 2844 2845
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2846 2847 2848 2849 2850 2851 2852 2853 2854 2855 2856 2857 2858 2859 2860 2861
		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;
2862 2863
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
2864 2865 2866 2867 2868 2869 2870 2871
		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);
2872 2873
		break;

2874
	default:
2875 2876 2877 2878
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2879
	}
2880

2881
	err = hci_req_run(&req, start_discovery_complete);
2882 2883
	if (err < 0)
		mgmt_pending_remove(cmd);
2884 2885
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2886 2887

failed:
2888
	hci_dev_unlock(hdev);
2889 2890 2891
	return err;
}

2892 2893 2894 2895 2896 2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907
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;
}

2908 2909 2910 2911 2912 2913 2914 2915 2916 2917 2918 2919 2920 2921 2922 2923 2924
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);
}

2925
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2926
			  u16 len)
2927
{
2928
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2929
	struct pending_cmd *cmd;
2930 2931
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2932 2933
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
2934 2935
	int err;

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

2938
	hci_dev_lock(hdev);
2939

2940
	if (!hci_discovery_active(hdev)) {
2941
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2942 2943
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2944 2945 2946 2947
		goto unlock;
	}

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

2954
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
2955 2956
	if (!cmd) {
		err = -ENOMEM;
2957 2958 2959
		goto unlock;
	}

2960 2961
	hci_req_init(&req, hdev);

2962 2963
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
2964 2965 2966 2967 2968 2969 2970 2971 2972 2973
		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);
		}
2974

2975 2976 2977 2978
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
2979
						     NAME_PENDING);
2980
		if (!e) {
2981
			mgmt_pending_remove(cmd);
2982 2983 2984 2985 2986 2987 2988
			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;
		}
2989

2990
		bacpy(&cp.bdaddr, &e->data.bdaddr);
2991 2992
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
2993 2994 2995 2996 2997

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
2998 2999 3000 3001 3002 3003

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

3006
	err = hci_req_run(&req, stop_discovery_complete);
3007 3008
	if (err < 0)
		mgmt_pending_remove(cmd);
3009 3010
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3011

3012
unlock:
3013
	hci_dev_unlock(hdev);
3014 3015 3016
	return err;
}

3017
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3018
			u16 len)
3019
{
3020
	struct mgmt_cp_confirm_name *cp = data;
3021 3022 3023
	struct inquiry_entry *e;
	int err;

3024
	BT_DBG("%s", hdev->name);
3025 3026 3027

	hci_dev_lock(hdev);

3028
	if (!hci_discovery_active(hdev)) {
3029
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3030
				 MGMT_STATUS_FAILED);
3031 3032 3033
		goto failed;
	}

3034
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3035
	if (!e) {
3036
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3037
				 MGMT_STATUS_INVALID_PARAMS);
3038 3039 3040 3041 3042 3043 3044 3045
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3046
		hci_inquiry_cache_update_resolve(hdev, e);
3047 3048
	}

3049 3050
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3051 3052 3053 3054 3055 3056

failed:
	hci_dev_unlock(hdev);
	return err;
}

3057
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3058
			u16 len)
3059
{
3060
	struct mgmt_cp_block_device *cp = data;
3061
	u8 status;
3062 3063
	int err;

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

3066
	if (!bdaddr_type_is_valid(cp->addr.type))
3067 3068 3069
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3070

3071
	hci_dev_lock(hdev);
3072

3073
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3074
	if (err < 0)
3075
		status = MGMT_STATUS_FAILED;
3076
	else
3077
		status = MGMT_STATUS_SUCCESS;
3078

3079
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3080
			   &cp->addr, sizeof(cp->addr));
3081

3082
	hci_dev_unlock(hdev);
3083 3084 3085 3086

	return err;
}

3087
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3088
			  u16 len)
3089
{
3090
	struct mgmt_cp_unblock_device *cp = data;
3091
	u8 status;
3092 3093
	int err;

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

3096
	if (!bdaddr_type_is_valid(cp->addr.type))
3097 3098 3099
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3100

3101
	hci_dev_lock(hdev);
3102

3103
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3104
	if (err < 0)
3105
		status = MGMT_STATUS_INVALID_PARAMS;
3106
	else
3107
		status = MGMT_STATUS_SUCCESS;
3108

3109
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3110
			   &cp->addr, sizeof(cp->addr));
3111

3112
	hci_dev_unlock(hdev);
3113 3114 3115 3116

	return err;
}

3117 3118 3119 3120
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3121
	struct hci_request req;
3122
	int err;
3123
	__u16 source;
3124 3125 3126

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

3127 3128 3129 3130 3131 3132
	source = __le16_to_cpu(cp->source);

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

3133 3134
	hci_dev_lock(hdev);

3135
	hdev->devid_source = source;
3136 3137 3138 3139 3140 3141
	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);

3142 3143 3144
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3145 3146 3147 3148 3149 3150

	hci_dev_unlock(hdev);

	return err;
}

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 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242
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;
}

3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258
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 {
3259 3260 3261 3262 3263 3264 3265
		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);

3266 3267 3268 3269 3270 3271 3272 3273 3274 3275
		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);
}

3276
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3277
				void *data, u16 len)
3278
{
3279
	struct mgmt_mode *cp = data;
3280 3281
	struct pending_cmd *cmd;
	struct hci_request req;
3282 3283
	int err;

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

3286 3287
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3288 3289 3290
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3291 3292 3293 3294
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3295
	if (!hdev_is_powered(hdev))
3296
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3297
				  MGMT_STATUS_NOT_POWERED);
3298 3299

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3300
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3301
				  MGMT_STATUS_REJECTED);
3302 3303 3304

	hci_dev_lock(hdev);

3305 3306 3307 3308 3309 3310
	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;
	}

3311 3312 3313 3314 3315 3316
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3317 3318 3319 3320 3321
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3322 3323
	}

3324 3325
	hci_req_init(&req, hdev);

3326
	write_fast_connectable(&req, cp->val);
3327 3328

	err = hci_req_run(&req, fast_connectable_complete);
3329
	if (err < 0) {
3330
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3331
				 MGMT_STATUS_FAILED);
3332
		mgmt_pending_remove(cmd);
3333 3334
	}

3335
unlock:
3336
	hci_dev_unlock(hdev);
3337

3338 3339 3340
	return err;
}

3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355 3356 3357 3358 3359 3360 3361 3362 3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379 3380 3381 3382 3383 3384 3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407 3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455
static void set_bredr_complete(struct hci_dev *hdev, u8 status)
{
	struct pending_cmd *cmd;

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

	hci_dev_lock(hdev);

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

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

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

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

	mgmt_pending_remove(cmd);

unlock:
	hci_dev_unlock(hdev);
}

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

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

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

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

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

	hci_dev_lock(hdev);

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

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

		change_bit(HCI_BREDR_ENABLED, &hdev->dev_flags);

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

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

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

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

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

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

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

unlock:
	hci_dev_unlock(hdev);
	return err;
}

3456 3457
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3458 3459
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3460 3461
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3462 3463
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3464 3465 3466
	return true;
}

3467
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3468
			       void *cp_data, u16 len)
3469 3470 3471
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3472
	int i, err;
3473

3474
	key_count = __le16_to_cpu(cp->key_count);
3475 3476 3477 3478 3479

	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",
3480
		       len, expected_len);
3481
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3482
				  MGMT_STATUS_INVALID_PARAMS);
3483 3484
	}

3485
	BT_DBG("%s key_count %u", hdev->name, key_count);
3486

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

3490
		if (!ltk_is_valid(key))
3491 3492 3493 3494 3495
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508
	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;

3509
		hci_add_ltk(hdev, &key->addr.bdaddr,
3510
			    bdaddr_to_le(key->addr.type),
3511 3512
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3513 3514
	}

3515 3516 3517
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3518 3519
	hci_dev_unlock(hdev);

3520
	return err;
3521 3522
}

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


3575 3576
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3577 3578
	void *buf;
	u8 *cp;
3579
	struct mgmt_hdr *hdr;
3580
	u16 opcode, index, len;
3581
	struct hci_dev *hdev = NULL;
3582
	const struct mgmt_handler *handler;
3583 3584 3585 3586 3587 3588 3589
	int err;

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

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

3590
	buf = kmalloc(msglen, GFP_KERNEL);
3591 3592 3593 3594 3595 3596 3597 3598
	if (!buf)
		return -ENOMEM;

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

3599
	hdr = buf;
3600 3601 3602
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3603 3604 3605 3606 3607 3608

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

3609
	if (index != MGMT_INDEX_NONE) {
3610 3611 3612
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3613
					 MGMT_STATUS_INVALID_INDEX);
3614 3615
			goto done;
		}
3616 3617 3618 3619 3620 3621

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

3624
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3625
	    mgmt_handlers[opcode].func == NULL) {
3626
		BT_DBG("Unknown op %u", opcode);
3627
		err = cmd_status(sk, index, opcode,
3628
				 MGMT_STATUS_UNKNOWN_COMMAND);
3629 3630 3631 3632
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3633
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3634
		err = cmd_status(sk, index, opcode,
3635
				 MGMT_STATUS_INVALID_INDEX);
3636
		goto done;
3637 3638
	}

3639 3640 3641
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3642
	    (!handler->var_len && len != handler->data_len)) {
3643
		err = cmd_status(sk, index, opcode,
3644
				 MGMT_STATUS_INVALID_PARAMS);
3645 3646 3647
		goto done;
	}

3648 3649 3650 3651 3652
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3653
	err = handler->func(sk, hdev, cp, len);
3654 3655 3656
	if (err < 0)
		goto done;

3657 3658 3659
	err = msglen;

done:
3660 3661 3662
	if (hdev)
		hci_dev_put(hdev);

3663 3664 3665
	kfree(buf);
	return err;
}
3666

3667
int mgmt_index_added(struct hci_dev *hdev)
3668
{
3669 3670 3671
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3672
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3673 3674
}

3675
int mgmt_index_removed(struct hci_dev *hdev)
3676
{
3677
	u8 status = MGMT_STATUS_INVALID_INDEX;
3678

3679 3680 3681
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3682
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3683

3684
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3685 3686
}

3687
static void set_bredr_scan(struct hci_request *req)
3688
{
3689
	struct hci_dev *hdev = req->hdev;
3690 3691
	u8 scan = 0;

3692 3693 3694 3695 3696 3697
	/* 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);

3698 3699 3700 3701 3702
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3703 3704
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3705 3706
}

3707 3708 3709 3710 3711 3712 3713 3714 3715 3716 3717 3718 3719 3720 3721 3722 3723 3724
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);
}

3725
static int powered_update_hci(struct hci_dev *hdev)
3726
{
3727
	struct hci_request req;
3728
	u8 link_sec;
3729

3730 3731
	hci_req_init(&req, hdev);

3732 3733 3734
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3735

3736
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3737
	}
3738

3739 3740
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
3741
		struct hci_cp_write_le_host_supported cp;
3742

3743 3744
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3745

3746 3747 3748 3749 3750
		/* 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))
3751 3752
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3753 3754 3755

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

3758 3759 3760 3761 3762 3763
	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);
	}

3764 3765
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3766 3767
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3768

3769
	if (lmp_bredr_capable(hdev)) {
3770 3771
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
3772
		update_class(&req);
3773
		update_name(&req);
3774
		update_eir(&req);
3775
	}
3776

3777
	return hci_req_run(&req, powered_complete);
3778
}
3779

3780 3781 3782
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3783 3784
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3785
	int err;
3786

3787 3788 3789 3790
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3791 3792
		if (powered_update_hci(hdev) == 0)
			return 0;
3793

3794 3795 3796
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3797 3798
	}

3799 3800 3801 3802 3803 3804 3805 3806
	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:
3807
	err = new_settings(hdev, match.sk);
3808 3809 3810 3811

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

3812
	return err;
3813
}
3814

3815 3816 3817 3818 3819 3820 3821 3822 3823 3824 3825 3826 3827 3828 3829 3830 3831 3832 3833 3834 3835
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;
}

3836
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3837
{
3838
	struct cmd_lookup match = { NULL, hdev };
3839 3840
	bool changed = false;
	int err = 0;
3841

3842 3843 3844 3845 3846 3847 3848
	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;
	}
3849

3850
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3851
			     &match);
3852

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

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

3859
	return err;
3860
}
3861

3862
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3863
{
3864
	struct pending_cmd *cmd;
3865 3866
	bool changed = false;
	int err = 0;
3867

3868 3869 3870 3871 3872 3873 3874
	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;
	}
3875

3876
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
3877

3878
	if (changed)
3879
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
3880

3881
	return err;
3882
}
3883

3884
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3885
{
3886 3887
	u8 mgmt_err = mgmt_status(status);

3888
	if (scan & SCAN_PAGE)
3889
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3890
				     cmd_status_rsp, &mgmt_err);
3891 3892

	if (scan & SCAN_INQUIRY)
3893
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3894
				     cmd_status_rsp, &mgmt_err);
3895 3896 3897 3898

	return 0;
}

3899 3900
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
3901
{
3902
	struct mgmt_ev_new_link_key ev;
3903

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

3906
	ev.store_hint = persistent;
3907
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
3908
	ev.key.addr.type = BDADDR_BREDR;
3909
	ev.key.type = key->type;
3910
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
3911
	ev.key.pin_len = key->pin_len;
3912

3913
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
3914
}
3915

3916 3917 3918 3919 3920 3921 3922 3923
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);
3924
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
3925 3926 3927 3928 3929 3930 3931 3932 3933 3934
	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));

3935 3936
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
3937 3938
}

3939
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
3940 3941
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
3942
{
3943 3944 3945
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
3946

3947
	bacpy(&ev->addr.bdaddr, bdaddr);
3948
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
3949

3950
	ev->flags = __cpu_to_le32(flags);
3951

3952 3953
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
3954
					  name, name_len);
3955 3956

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
3957
		eir_len = eir_append_data(ev->eir, eir_len,
3958
					  EIR_CLASS_OF_DEV, dev_class, 3);
3959

3960
	ev->eir_len = cpu_to_le16(eir_len);
3961 3962

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
3963
			  sizeof(*ev) + eir_len, NULL);
3964 3965
}

3966 3967
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
3968
	struct mgmt_cp_disconnect *cp = cmd->param;
3969
	struct sock **sk = data;
3970
	struct mgmt_rp_disconnect rp;
3971

3972 3973
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3974

3975
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
3976
		     sizeof(rp));
3977 3978 3979 3980

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

3981
	mgmt_pending_remove(cmd);
3982 3983
}

3984
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
3985
{
3986
	struct hci_dev *hdev = data;
3987 3988
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
3989 3990

	memset(&rp, 0, sizeof(rp));
3991 3992
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
3993

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

3996
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
3997 3998 3999 4000

	mgmt_pending_remove(cmd);
}

4001
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
4002
			     u8 link_type, u8 addr_type, u8 reason)
4003
{
4004
	struct mgmt_ev_device_disconnected ev;
4005 4006 4007
	struct sock *sk = NULL;
	int err;

4008
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4009

4010 4011 4012
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4013

4014
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
4015
			 sk);
4016 4017

	if (sk)
4018
		sock_put(sk);
4019

4020
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4021
			     hdev);
4022

4023 4024 4025
	return err;
}

4026
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
4027
			   u8 link_type, u8 addr_type, u8 status)
4028
{
4029
	struct mgmt_rp_disconnect rp;
4030 4031 4032
	struct pending_cmd *cmd;
	int err;

4033 4034 4035
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4036
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4037 4038 4039
	if (!cmd)
		return -ENOENT;

4040
	bacpy(&rp.addr.bdaddr, bdaddr);
4041
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4042

4043
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
4044
			   mgmt_status(status), &rp, sizeof(rp));
4045

4046
	mgmt_pending_remove(cmd);
4047 4048

	return err;
4049
}
4050

4051
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4052
			u8 addr_type, u8 status)
4053 4054 4055
{
	struct mgmt_ev_connect_failed ev;

4056
	bacpy(&ev.addr.bdaddr, bdaddr);
4057
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4058
	ev.status = mgmt_status(status);
4059

4060
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4061
}
4062

4063
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4064 4065 4066
{
	struct mgmt_ev_pin_code_request ev;

4067
	bacpy(&ev.addr.bdaddr, bdaddr);
4068
	ev.addr.type = BDADDR_BREDR;
4069
	ev.secure = secure;
4070

4071
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4072
			  NULL);
4073 4074
}

4075
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4076
				 u8 status)
4077 4078
{
	struct pending_cmd *cmd;
4079
	struct mgmt_rp_pin_code_reply rp;
4080 4081
	int err;

4082
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4083 4084 4085
	if (!cmd)
		return -ENOENT;

4086
	bacpy(&rp.addr.bdaddr, bdaddr);
4087
	rp.addr.type = BDADDR_BREDR;
4088

4089
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4090
			   mgmt_status(status), &rp, sizeof(rp));
4091

4092
	mgmt_pending_remove(cmd);
4093 4094 4095 4096

	return err;
}

4097
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4098
				     u8 status)
4099 4100
{
	struct pending_cmd *cmd;
4101
	struct mgmt_rp_pin_code_reply rp;
4102 4103
	int err;

4104
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4105 4106 4107
	if (!cmd)
		return -ENOENT;

4108
	bacpy(&rp.addr.bdaddr, bdaddr);
4109
	rp.addr.type = BDADDR_BREDR;
4110

4111
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4112
			   mgmt_status(status), &rp, sizeof(rp));
4113

4114
	mgmt_pending_remove(cmd);
4115 4116 4117

	return err;
}
4118

4119
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4120 4121
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4122 4123 4124
{
	struct mgmt_ev_user_confirm_request ev;

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

4127
	bacpy(&ev.addr.bdaddr, bdaddr);
4128
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4129
	ev.confirm_hint = confirm_hint;
4130
	ev.value = value;
4131

4132
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4133
			  NULL);
4134 4135
}

4136
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4137
			      u8 link_type, u8 addr_type)
4138 4139 4140 4141 4142
{
	struct mgmt_ev_user_passkey_request ev;

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

4143
	bacpy(&ev.addr.bdaddr, bdaddr);
4144
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4145 4146

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4147
			  NULL);
4148 4149
}

4150
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4151 4152
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4153 4154 4155 4156 4157
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4158
	cmd = mgmt_pending_find(opcode, hdev);
4159 4160 4161
	if (!cmd)
		return -ENOENT;

4162
	bacpy(&rp.addr.bdaddr, bdaddr);
4163
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4164
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4165
			   &rp, sizeof(rp));
4166

4167
	mgmt_pending_remove(cmd);
4168 4169 4170 4171

	return err;
}

4172
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4173
				     u8 link_type, u8 addr_type, u8 status)
4174
{
4175
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4176
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4177 4178
}

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

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

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

4202 4203 4204 4205 4206 4207 4208 4209 4210 4211 4212 4213 4214 4215 4216 4217
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);
}

4218
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4219
		     u8 addr_type, u8 status)
4220 4221 4222
{
	struct mgmt_ev_auth_failed ev;

4223
	bacpy(&ev.addr.bdaddr, bdaddr);
4224
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4225
	ev.status = mgmt_status(status);
4226

4227
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4228
}
4229

4230 4231 4232
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4233 4234
	bool changed = false;
	int err = 0;
4235 4236 4237 4238

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4239
				     cmd_status_rsp, &mgmt_err);
4240 4241 4242
		return 0;
	}

4243 4244 4245 4246 4247 4248 4249 4250
	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;
	}

4251
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4252
			     &match);
4253

4254 4255
	if (changed)
		err = new_settings(hdev, match.sk);
4256 4257 4258 4259 4260 4261 4262

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

	return err;
}

4263
static void clear_eir(struct hci_request *req)
4264
{
4265
	struct hci_dev *hdev = req->hdev;
4266 4267
	struct hci_cp_write_eir cp;

4268
	if (!lmp_ext_inq_capable(hdev))
4269
		return;
4270

4271 4272
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4275
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4276 4277
}

4278
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4279 4280
{
	struct cmd_lookup match = { NULL, hdev };
4281
	struct hci_request req;
4282 4283
	bool changed = false;
	int err = 0;
4284 4285 4286

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4289
						 &hdev->dev_flags))
4290 4291
			err = new_settings(hdev, NULL);

4292 4293
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4294 4295 4296 4297 4298 4299 4300 4301 4302 4303

		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;
4304 4305 4306 4307
	}

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

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

4311
	if (match.sk)
4312 4313
		sock_put(match.sk);

4314 4315
	hci_req_init(&req, hdev);

4316
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4317
		update_eir(&req);
4318
	else
4319 4320 4321
		clear_eir(&req);

	hci_req_run(&req, NULL);
4322

4323 4324 4325
	return err;
}

4326
static void sk_lookup(struct pending_cmd *cmd, void *data)
4327 4328 4329 4330 4331 4332 4333 4334 4335
{
	struct cmd_lookup *match = data;

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

4336
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4337
				   u8 status)
4338
{
4339 4340
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4341

4342 4343 4344
	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);
4345 4346

	if (!status)
4347 4348
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4349 4350 4351

	if (match.sk)
		sock_put(match.sk);
4352 4353 4354 4355

	return err;
}

4356
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4357 4358
{
	struct mgmt_cp_set_local_name ev;
4359
	struct pending_cmd *cmd;
4360

4361 4362
	if (status)
		return 0;
4363 4364 4365

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

4368
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4369 4370
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4371

4372 4373 4374 4375 4376
		/* 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;
4377
	}
4378

4379 4380
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4381
}
4382

4383
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4384
					    u8 *randomizer, u8 status)
4385 4386 4387 4388
{
	struct pending_cmd *cmd;
	int err;

4389
	BT_DBG("%s status %u", hdev->name, status);
4390

4391
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4392 4393 4394 4395
	if (!cmd)
		return -ENOENT;

	if (status) {
4396 4397
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4398 4399 4400 4401 4402 4403
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4404
		err = cmd_complete(cmd->sk, hdev->id,
4405 4406
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4407 4408 4409 4410 4411 4412
	}

	mgmt_pending_remove(cmd);

	return err;
}
4413

4414
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4415 4416
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
4417
{
4418 4419
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4420
	size_t ev_size;
4421

4422 4423 4424
	if (!hci_discovery_active(hdev))
		return -EPERM;

4425 4426
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4427 4428
		return -EINVAL;

4429 4430
	memset(buf, 0, sizeof(buf));

4431
	bacpy(&ev->addr.bdaddr, bdaddr);
4432
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4433
	ev->rssi = rssi;
4434
	if (cfm_name)
4435
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4436
	if (!ssp)
4437
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4438

4439
	if (eir_len > 0)
4440
		memcpy(ev->eir, eir, eir_len);
4441

4442 4443
	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,
4444
					  dev_class, 3);
4445

4446
	ev->eir_len = cpu_to_le16(eir_len);
4447
	ev_size = sizeof(*ev) + eir_len;
4448

4449
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4450
}
4451

4452
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4453
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4454
{
4455 4456 4457
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4458

4459
	ev = (struct mgmt_ev_device_found *) buf;
4460

4461 4462 4463
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4464
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4465 4466 4467
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4468
				  name_len);
4469

4470
	ev->eir_len = cpu_to_le16(eir_len);
4471

4472
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
4473
			  sizeof(*ev) + eir_len, NULL);
4474
}
4475

4476
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4477
{
4478
	struct mgmt_ev_discovering ev;
4479 4480
	struct pending_cmd *cmd;

4481 4482
	BT_DBG("%s discovering %u", hdev->name, discovering);

4483
	if (discovering)
4484
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4485
	else
4486
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4487 4488

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

4491 4492
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4493 4494 4495
		mgmt_pending_remove(cmd);
	}

4496 4497 4498 4499 4500
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4501
}
4502

4503
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4504 4505 4506 4507
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4508
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4509

4510 4511
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4512

4513
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4514
			  cmd ? cmd->sk : NULL);
4515 4516
}

4517
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4518 4519 4520 4521
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4522
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4523

4524 4525
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4526

4527
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4528
			  cmd ? cmd->sk : NULL);
4529
}