mgmt.c 106.7 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	4
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
	MGMT_OP_SET_STATIC_ADDRESS,
80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102
};

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

106
#define CACHE_TIMEOUT	msecs_to_jiffies(2 * 1000)
107

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

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

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

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

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

	return MGMT_STATUS_FAILED;
}

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

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

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

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

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

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

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

225
	return err;
226 227
}

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

259
	return err;
260 261
}

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

	BT_DBG("sock %p", sk);

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

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

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

	BT_DBG("sock %p", sk);

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

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

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

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

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

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

	return err;
}

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

	BT_DBG("sock %p", sk);

	read_lock(&hci_dev_list_lock);

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

328 329 330
		count++;
	}

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

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

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

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

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

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

356 357
	read_unlock(&hci_dev_list_lock);

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

361 362 363
	kfree(rp);

	return err;
364 365
}

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

	settings |= MGMT_SETTING_POWERED;
	settings |= MGMT_SETTING_PAIRABLE;

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

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

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

	return settings;
}

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

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

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

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

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

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

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

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

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

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

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

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

431 432 433
	return settings;
}

434 435
#define PNP_INFO_SVCLASS_ID		0x1200

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

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

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

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

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

		ptr += 3;
	}

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

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

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

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

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

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

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

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

	create_eir(hdev, cp.data);

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

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

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

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

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

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

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

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

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

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

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

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

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

664 665
	hci_req_init(&req, hdev);

666 667
	hci_dev_lock(hdev);

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

	hci_dev_unlock(hdev);
672 673

	hci_req_run(&req, NULL);
674 675
}

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

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

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

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

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

698
	hci_dev_lock(hdev);
699

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

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

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

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

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

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

715
	hci_dev_unlock(hdev);
716

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

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

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

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

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

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

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

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

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

755
	return cmd;
756 757
}

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

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

		cb(cmd, data);
	}
}

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

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

	return NULL;
}

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

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

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

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

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

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

812
	hci_dev_lock(hdev);
813

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

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

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

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

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

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

847
	err = 0;
848 849

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

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

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

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

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

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

893 894 895 896 897
int mgmt_new_settings(struct hci_dev *hdev)
{
	return new_settings(hdev, NULL);
}

898 899 900 901 902 903 904 905 906 907 908 909 910 911 912 913 914 915 916 917 918 919 920 921 922 923 924 925 926 927
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);
}

928 929 930 931 932 933 934 935 936 937 938 939 940 941 942 943 944 945 946 947
static u8 mgmt_bredr_support(struct hci_dev *hdev)
{
	if (!lmp_bredr_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
	else if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

static u8 mgmt_le_support(struct hci_dev *hdev)
{
	if (!lmp_le_capable(hdev))
		return MGMT_STATUS_NOT_SUPPORTED;
	else if (!test_bit(HCI_LE_ENABLED, &hdev->dev_flags))
		return MGMT_STATUS_REJECTED;
	else
		return MGMT_STATUS_SUCCESS;
}

948
static int set_discoverable(struct sock *sk, struct hci_dev *hdev, void *data,
949
			    u16 len)
950
{
951
	struct mgmt_cp_set_discoverable *cp = data;
952
	struct pending_cmd *cmd;
953
	u16 timeout;
954
	u8 scan, status;
955 956
	int err;

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

959 960
	status = mgmt_bredr_support(hdev);
	if (status)
961
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
962
				  status);
963

964 965 966 967
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
				  MGMT_STATUS_INVALID_PARAMS);

968
	timeout = __le16_to_cpu(cp->timeout);
969
	if (!cp->val && timeout > 0)
970
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
971
				  MGMT_STATUS_INVALID_PARAMS);
972

973
	hci_dev_lock(hdev);
974

975
	if (!hdev_is_powered(hdev) && timeout > 0) {
976
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
977
				 MGMT_STATUS_NOT_POWERED);
978 979 980
		goto failed;
	}

981
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
982
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
983
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
984
				 MGMT_STATUS_BUSY);
985 986 987
		goto failed;
	}

988
	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags)) {
989
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DISCOVERABLE,
990
				 MGMT_STATUS_REJECTED);
991 992 993 994
		goto failed;
	}

	if (!hdev_is_powered(hdev)) {
995 996 997 998 999 1000 1001
		bool changed = false;

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

1002
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1003 1004 1005 1006 1007 1008
		if (err < 0)
			goto failed;

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

1009 1010 1011 1012
		goto failed;
	}

	if (!!cp->val == test_bit(HCI_DISCOVERABLE, &hdev->dev_flags)) {
1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023
		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));
		}

1024
		err = send_settings_rsp(sk, MGMT_OP_SET_DISCOVERABLE, hdev);
1025 1026 1027
		goto failed;
	}

1028
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DISCOVERABLE, hdev, data, len);
1029 1030
	if (!cmd) {
		err = -ENOMEM;
1031
		goto failed;
1032
	}
1033 1034 1035

	scan = SCAN_PAGE;

1036
	if (cp->val)
1037
		scan |= SCAN_INQUIRY;
1038
	else
1039
		cancel_delayed_work(&hdev->discov_off);
1040 1041 1042

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

1045
	if (cp->val)
1046
		hdev->discov_timeout = timeout;
1047

1048
failed:
1049
	hci_dev_unlock(hdev);
1050 1051 1052
	return err;
}

1053 1054
static void write_fast_connectable(struct hci_request *req, bool enable)
{
1055
	struct hci_dev *hdev = req->hdev;
1056 1057 1058
	struct hci_cp_write_page_scan_activity acp;
	u8 type;

1059 1060 1061
	if (hdev->hci_ver < BLUETOOTH_VER_1_2)
		return;

1062 1063 1064 1065 1066 1067 1068 1069 1070 1071 1072 1073 1074 1075
	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);

1076 1077 1078 1079 1080 1081 1082
	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);
1083 1084
}

1085 1086 1087 1088 1089 1090 1091 1092 1093 1094 1095 1096 1097 1098 1099 1100 1101 1102 1103 1104
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);
}

1105
static int set_connectable(struct sock *sk, struct hci_dev *hdev, void *data,
1106
			   u16 len)
1107
{
1108
	struct mgmt_mode *cp = data;
1109
	struct pending_cmd *cmd;
1110
	struct hci_request req;
1111
	u8 scan, status;
1112 1113
	int err;

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

1116 1117
	status = mgmt_bredr_support(hdev);
	if (status)
1118
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1119
				  status);
1120

1121 1122 1123 1124
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1125
	hci_dev_lock(hdev);
1126

1127
	if (!hdev_is_powered(hdev)) {
1128 1129 1130 1131 1132
		bool changed = false;

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

1133
		if (cp->val) {
1134
			set_bit(HCI_CONNECTABLE, &hdev->dev_flags);
1135
		} else {
1136 1137 1138
			clear_bit(HCI_CONNECTABLE, &hdev->dev_flags);
			clear_bit(HCI_DISCOVERABLE, &hdev->dev_flags);
		}
1139

1140
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1141 1142 1143 1144 1145 1146
		if (err < 0)
			goto failed;

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

1147 1148 1149
		goto failed;
	}

1150
	if (mgmt_pending_find(MGMT_OP_SET_DISCOVERABLE, hdev) ||
1151
	    mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev)) {
1152
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_CONNECTABLE,
1153
				 MGMT_STATUS_BUSY);
1154 1155 1156
		goto failed;
	}

1157
	if (!!cp->val == test_bit(HCI_PSCAN, &hdev->flags)) {
1158
		err = send_settings_rsp(sk, MGMT_OP_SET_CONNECTABLE, hdev);
1159 1160 1161
		goto failed;
	}

1162
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_CONNECTABLE, hdev, data, len);
1163 1164
	if (!cmd) {
		err = -ENOMEM;
1165
		goto failed;
1166
	}
1167

1168
	if (cp->val) {
1169
		scan = SCAN_PAGE;
1170
	} else {
1171 1172
		scan = 0;

1173
		if (test_bit(HCI_ISCAN, &hdev->flags) &&
1174
		    hdev->discov_timeout > 0)
1175 1176 1177
			cancel_delayed_work(&hdev->discov_off);
	}

1178 1179 1180 1181
	hci_req_init(&req, hdev);

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

1182 1183 1184 1185 1186 1187 1188
	/* 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))
1189 1190
		write_fast_connectable(&req, false);

1191
	err = hci_req_run(&req, set_connectable_complete);
1192
	if (err < 0)
1193
		mgmt_pending_remove(cmd);
1194 1195

failed:
1196
	hci_dev_unlock(hdev);
1197 1198 1199
	return err;
}

1200
static int set_pairable(struct sock *sk, struct hci_dev *hdev, void *data,
1201
			u16 len)
1202
{
1203
	struct mgmt_mode *cp = data;
1204 1205
	int err;

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

1208 1209 1210 1211
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_PAIRABLE,
				  MGMT_STATUS_INVALID_PARAMS);

1212
	hci_dev_lock(hdev);
1213 1214

	if (cp->val)
1215
		set_bit(HCI_PAIRABLE, &hdev->dev_flags);
1216
	else
1217
		clear_bit(HCI_PAIRABLE, &hdev->dev_flags);
1218

1219
	err = send_settings_rsp(sk, MGMT_OP_SET_PAIRABLE, hdev);
1220 1221 1222
	if (err < 0)
		goto failed;

1223
	err = new_settings(hdev, sk);
1224 1225

failed:
1226
	hci_dev_unlock(hdev);
1227 1228 1229
	return err;
}

1230 1231
static int set_link_security(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
1232 1233 1234
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1235
	u8 val, status;
1236 1237
	int err;

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

1240 1241
	status = mgmt_bredr_support(hdev);
	if (status)
1242
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1243
				  status);
1244

1245 1246 1247 1248
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
				  MGMT_STATUS_INVALID_PARAMS);

1249 1250
	hci_dev_lock(hdev);

1251
	if (!hdev_is_powered(hdev)) {
1252 1253 1254
		bool changed = false;

		if (!!cp->val != test_bit(HCI_LINK_SECURITY,
1255
					  &hdev->dev_flags)) {
1256 1257 1258 1259 1260 1261 1262 1263 1264 1265 1266
			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);

1267 1268 1269 1270
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_LINK_SECURITY, hdev)) {
1271
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LINK_SECURITY,
1272
				 MGMT_STATUS_BUSY);
1273 1274 1275 1276 1277 1278 1279 1280 1281 1282 1283 1284 1285 1286 1287 1288 1289 1290 1291 1292 1293 1294 1295 1296 1297 1298 1299
		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;
}

1300
static int set_ssp(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1301 1302 1303
{
	struct mgmt_mode *cp = data;
	struct pending_cmd *cmd;
1304
	u8 val, status;
1305 1306
	int err;

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

1309 1310 1311 1312
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP, status);

1313 1314 1315
	if (!lmp_ssp_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_NOT_SUPPORTED);
1316

1317 1318 1319 1320
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				  MGMT_STATUS_INVALID_PARAMS);

1321
	hci_dev_lock(hdev);
1322

1323 1324
	val = !!cp->val;

1325
	if (!hdev_is_powered(hdev)) {
1326 1327 1328 1329 1330 1331 1332 1333 1334 1335 1336 1337 1338 1339
		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);

1340 1341 1342 1343
		goto failed;
	}

	if (mgmt_pending_find(MGMT_OP_SET_SSP, hdev)) {
1344 1345
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_SSP,
				 MGMT_STATUS_BUSY);
1346 1347 1348 1349 1350 1351 1352 1353 1354 1355 1356 1357 1358 1359 1360 1361 1362 1363 1364 1365 1366 1367 1368 1369 1370
		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;
}

1371
static int set_hs(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1372 1373
{
	struct mgmt_mode *cp = data;
1374
	bool changed;
1375
	u8 status;
1376
	int err;
1377

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

1380 1381 1382
	status = mgmt_bredr_support(hdev);
	if (status)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS, status);
1383

1384 1385 1386 1387
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
				  MGMT_STATUS_INVALID_PARAMS);

1388 1389
	hci_dev_lock(hdev);

1390
	if (cp->val) {
1391
		changed = !test_and_set_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1392 1393 1394 1395 1396 1397 1398
	} else {
		if (hdev_is_powered(hdev)) {
			err = cmd_status(sk, hdev->id, MGMT_OP_SET_HS,
					 MGMT_STATUS_REJECTED);
			goto unlock;
		}

1399
		changed = test_and_clear_bit(HCI_HS_ENABLED, &hdev->dev_flags);
1400
	}
1401 1402 1403 1404 1405 1406 1407

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

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

1409 1410 1411
unlock:
	hci_dev_unlock(hdev);
	return err;
1412 1413
}

1414 1415 1416 1417 1418 1419 1420 1421 1422 1423 1424 1425 1426 1427 1428 1429 1430 1431 1432 1433
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);
}

1434
static int set_le(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1435 1436 1437 1438
{
	struct mgmt_mode *cp = data;
	struct hci_cp_write_le_host_supported hci_cp;
	struct pending_cmd *cmd;
1439
	struct hci_request req;
1440
	int err;
1441
	u8 val, enabled;
1442

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

1445 1446 1447
	if (!lmp_le_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_NOT_SUPPORTED);
1448

1449 1450 1451 1452
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_INVALID_PARAMS);

1453
	/* LE-only devices do not allow toggling LE on/off */
1454
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
1455 1456 1457
		return cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
				  MGMT_STATUS_REJECTED);

1458
	hci_dev_lock(hdev);
1459 1460

	val = !!cp->val;
1461
	enabled = lmp_host_le_capable(hdev);
1462

1463
	if (!hdev_is_powered(hdev) || val == enabled) {
1464 1465 1466 1467 1468 1469 1470
		bool changed = false;

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

1471 1472
		if (!val && test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			clear_bit(HCI_ADVERTISING, &hdev->dev_flags);
1473 1474 1475
			changed = true;
		}

1476 1477
		err = send_settings_rsp(sk, MGMT_OP_SET_LE, hdev);
		if (err < 0)
1478
			goto unlock;
1479 1480 1481 1482

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

1483
		goto unlock;
1484 1485
	}

1486 1487
	if (mgmt_pending_find(MGMT_OP_SET_LE, hdev) ||
	    mgmt_pending_find(MGMT_OP_SET_ADVERTISING, hdev)) {
1488
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_LE,
1489
				 MGMT_STATUS_BUSY);
1490
		goto unlock;
1491 1492 1493 1494 1495
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LE, hdev, data, len);
	if (!cmd) {
		err = -ENOMEM;
1496
		goto unlock;
1497 1498 1499 1500 1501 1502
	}

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

	if (val) {
		hci_cp.le = val;
1503
		hci_cp.simul = lmp_le_br_capable(hdev);
1504 1505
	}

1506 1507
	hci_req_init(&req, hdev);

1508
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags) && !val)
1509 1510
		hci_req_add(&req, HCI_OP_LE_SET_ADV_ENABLE, sizeof(val), &val);

1511 1512 1513 1514
	hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED, sizeof(hci_cp),
		    &hci_cp);

	err = hci_req_run(&req, le_enable_complete);
1515
	if (err < 0)
1516 1517
		mgmt_pending_remove(cmd);

1518 1519
unlock:
	hci_dev_unlock(hdev);
1520 1521 1522
	return err;
}

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

1546 1547 1548 1549 1550 1551 1552 1553 1554 1555 1556 1557 1558 1559 1560 1561 1562 1563 1564
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;
}

1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589 1590
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);
}

1591
static int add_uuid(struct sock *sk, struct hci_dev *hdev, void *data, u16 len)
1592
{
1593
	struct mgmt_cp_add_uuid *cp = data;
1594
	struct pending_cmd *cmd;
1595
	struct hci_request req;
1596 1597 1598
	struct bt_uuid *uuid;
	int err;

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

1601
	hci_dev_lock(hdev);
1602

1603
	if (pending_eir_or_class(hdev)) {
1604
		err = cmd_status(sk, hdev->id, MGMT_OP_ADD_UUID,
1605
				 MGMT_STATUS_BUSY);
1606 1607 1608
		goto failed;
	}

1609
	uuid = kmalloc(sizeof(*uuid), GFP_KERNEL);
1610 1611 1612 1613 1614 1615
	if (!uuid) {
		err = -ENOMEM;
		goto failed;
	}

	memcpy(uuid->uuid, cp->uuid, 16);
1616
	uuid->svc_hint = cp->svc_hint;
1617
	uuid->size = get_uuid_size(cp->uuid);
1618

1619
	list_add_tail(&uuid->list, &hdev->uuids);
1620

1621
	hci_req_init(&req, hdev);
1622

1623 1624 1625
	update_class(&req);
	update_eir(&req);

1626 1627 1628 1629
	err = hci_req_run(&req, add_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto failed;
1630

1631
		err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_UUID, 0,
1632
				   hdev->dev_class, 3);
1633 1634 1635 1636
		goto failed;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_ADD_UUID, hdev, data, len);
1637
	if (!cmd) {
1638
		err = -ENOMEM;
1639 1640 1641 1642
		goto failed;
	}

	err = 0;
1643 1644

failed:
1645
	hci_dev_unlock(hdev);
1646 1647 1648
	return err;
}

1649 1650 1651 1652 1653 1654
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)) {
1655 1656
		queue_delayed_work(hdev->workqueue, &hdev->service_cache,
				   CACHE_TIMEOUT);
1657 1658 1659 1660 1661 1662
		return true;
	}

	return false;
}

1663 1664 1665 1666 1667 1668 1669
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);
}

1670
static int remove_uuid(struct sock *sk, struct hci_dev *hdev, void *data,
1671
		       u16 len)
1672
{
1673
	struct mgmt_cp_remove_uuid *cp = data;
1674
	struct pending_cmd *cmd;
1675
	struct bt_uuid *match, *tmp;
1676
	u8 bt_uuid_any[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 };
1677
	struct hci_request req;
1678 1679
	int err, found;

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

1682
	hci_dev_lock(hdev);
1683

1684
	if (pending_eir_or_class(hdev)) {
1685
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1686
				 MGMT_STATUS_BUSY);
1687 1688 1689
		goto unlock;
	}

1690 1691
	if (memcmp(cp->uuid, bt_uuid_any, 16) == 0) {
		err = hci_uuids_clear(hdev);
1692

1693
		if (enable_service_cache(hdev)) {
1694
			err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1695
					   0, hdev->dev_class, 3);
1696 1697
			goto unlock;
		}
1698

1699
		goto update_class;
1700 1701 1702 1703
	}

	found = 0;

1704
	list_for_each_entry_safe(match, tmp, &hdev->uuids, list) {
1705 1706 1707 1708
		if (memcmp(match->uuid, cp->uuid, 16) != 0)
			continue;

		list_del(&match->list);
1709
		kfree(match);
1710 1711 1712 1713
		found++;
	}

	if (found == 0) {
1714
		err = cmd_status(sk, hdev->id, MGMT_OP_REMOVE_UUID,
1715
				 MGMT_STATUS_INVALID_PARAMS);
1716 1717 1718
		goto unlock;
	}

1719
update_class:
1720
	hci_req_init(&req, hdev);
1721

1722 1723 1724
	update_class(&req);
	update_eir(&req);

1725 1726 1727 1728
	err = hci_req_run(&req, remove_uuid_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1729

1730
		err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_UUID, 0,
1731
				   hdev->dev_class, 3);
1732 1733 1734 1735
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_REMOVE_UUID, hdev, data, len);
1736
	if (!cmd) {
1737
		err = -ENOMEM;
1738 1739 1740 1741
		goto unlock;
	}

	err = 0;
1742 1743

unlock:
1744
	hci_dev_unlock(hdev);
1745 1746 1747
	return err;
}

1748 1749 1750 1751 1752 1753 1754
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);
}

1755
static int set_dev_class(struct sock *sk, struct hci_dev *hdev, void *data,
1756
			 u16 len)
1757
{
1758
	struct mgmt_cp_set_dev_class *cp = data;
1759
	struct pending_cmd *cmd;
1760
	struct hci_request req;
1761 1762
	int err;

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

1765
	if (!lmp_bredr_capable(hdev))
1766 1767
		return cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				  MGMT_STATUS_NOT_SUPPORTED);
1768

1769
	hci_dev_lock(hdev);
1770

1771 1772 1773 1774 1775
	if (pending_eir_or_class(hdev)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_DEV_CLASS,
				 MGMT_STATUS_BUSY);
		goto unlock;
	}
1776

1777 1778 1779 1780 1781
	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;
	}
1782

1783 1784 1785
	hdev->major_class = cp->major;
	hdev->minor_class = cp->minor;

1786
	if (!hdev_is_powered(hdev)) {
1787
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1788
				   hdev->dev_class, 3);
1789 1790 1791
		goto unlock;
	}

1792 1793
	hci_req_init(&req, hdev);

1794
	if (test_and_clear_bit(HCI_SERVICE_CACHE, &hdev->dev_flags)) {
1795 1796 1797
		hci_dev_unlock(hdev);
		cancel_delayed_work_sync(&hdev->service_cache);
		hci_dev_lock(hdev);
1798
		update_eir(&req);
1799
	}
1800

1801 1802
	update_class(&req);

1803 1804 1805 1806
	err = hci_req_run(&req, set_class_complete);
	if (err < 0) {
		if (err != -ENODATA)
			goto unlock;
1807

1808
		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_DEV_CLASS, 0,
1809
				   hdev->dev_class, 3);
1810 1811 1812 1813
		goto unlock;
	}

	cmd = mgmt_pending_add(sk, MGMT_OP_SET_DEV_CLASS, hdev, data, len);
1814
	if (!cmd) {
1815
		err = -ENOMEM;
1816 1817 1818 1819
		goto unlock;
	}

	err = 0;
1820

1821
unlock:
1822
	hci_dev_unlock(hdev);
1823 1824 1825
	return err;
}

1826
static int load_link_keys(struct sock *sk, struct hci_dev *hdev, void *data,
1827
			  u16 len)
1828
{
1829
	struct mgmt_cp_load_link_keys *cp = data;
1830
	u16 key_count, expected_len;
1831
	int i;
1832

1833 1834 1835 1836 1837 1838
	BT_DBG("request for %s", hdev->name);

	if (!lmp_bredr_capable(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_NOT_SUPPORTED);

1839
	key_count = __le16_to_cpu(cp->key_count);
1840

1841 1842
	expected_len = sizeof(*cp) + key_count *
					sizeof(struct mgmt_link_key_info);
1843
	if (expected_len != len) {
1844
		BT_ERR("load_link_keys: expected %u bytes, got %u bytes",
1845
		       len, expected_len);
1846
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
1847
				  MGMT_STATUS_INVALID_PARAMS);
1848 1849
	}

1850 1851 1852 1853
	if (cp->debug_keys != 0x00 && cp->debug_keys != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS,
				  MGMT_STATUS_INVALID_PARAMS);

1854
	BT_DBG("%s debug_keys %u key_count %u", hdev->name, cp->debug_keys,
1855
	       key_count);
1856

1857 1858 1859 1860 1861 1862 1863 1864
	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);
	}

1865
	hci_dev_lock(hdev);
1866 1867 1868 1869

	hci_link_keys_clear(hdev);

	if (cp->debug_keys)
1870
		set_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1871
	else
1872
		clear_bit(HCI_DEBUG_KEYS, &hdev->dev_flags);
1873

1874
	for (i = 0; i < key_count; i++) {
1875
		struct mgmt_link_key_info *key = &cp->keys[i];
1876

1877
		hci_add_link_key(hdev, NULL, 0, &key->addr.bdaddr, key->val,
1878
				 key->type, key->pin_len);
1879 1880
	}

1881
	cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LINK_KEYS, 0, NULL, 0);
1882

1883
	hci_dev_unlock(hdev);
1884

1885
	return 0;
1886 1887
}

1888
static int device_unpaired(struct hci_dev *hdev, bdaddr_t *bdaddr,
1889
			   u8 addr_type, struct sock *skip_sk)
1890 1891 1892 1893 1894 1895 1896
{
	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),
1897
			  skip_sk);
1898 1899
}

1900
static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
1901
			 u16 len)
1902
{
1903 1904
	struct mgmt_cp_unpair_device *cp = data;
	struct mgmt_rp_unpair_device rp;
1905 1906
	struct hci_cp_disconnect dc;
	struct pending_cmd *cmd;
1907 1908 1909
	struct hci_conn *conn;
	int err;

1910
	memset(&rp, 0, sizeof(rp));
1911 1912
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
1913

1914 1915 1916 1917 1918
	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));

1919 1920 1921 1922 1923
	if (cp->disconnect != 0x00 && cp->disconnect != 0x01)
		return cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));

1924 1925
	hci_dev_lock(hdev);

1926
	if (!hdev_is_powered(hdev)) {
1927
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1928
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
1929 1930 1931
		goto unlock;
	}

1932
	if (cp->addr.type == BDADDR_BREDR)
1933 1934 1935
		err = hci_remove_link_key(hdev, &cp->addr.bdaddr);
	else
		err = hci_remove_ltk(hdev, &cp->addr.bdaddr);
1936

1937
	if (err < 0) {
1938
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE,
1939
				   MGMT_STATUS_NOT_PAIRED, &rp, sizeof(rp));
1940 1941 1942
		goto unlock;
	}

1943
	if (cp->disconnect) {
1944
		if (cp->addr.type == BDADDR_BREDR)
1945
			conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
1946
						       &cp->addr.bdaddr);
1947 1948
		else
			conn = hci_conn_hash_lookup_ba(hdev, LE_LINK,
1949
						       &cp->addr.bdaddr);
1950 1951 1952
	} else {
		conn = NULL;
	}
1953

1954
	if (!conn) {
1955
		err = cmd_complete(sk, hdev->id, MGMT_OP_UNPAIR_DEVICE, 0,
1956
				   &rp, sizeof(rp));
1957
		device_unpaired(hdev, &cp->addr.bdaddr, cp->addr.type, sk);
1958 1959
		goto unlock;
	}
1960

1961
	cmd = mgmt_pending_add(sk, MGMT_OP_UNPAIR_DEVICE, hdev, cp,
1962
			       sizeof(*cp));
1963 1964 1965
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
1966 1967
	}

1968
	dc.handle = cpu_to_le16(conn->handle);
1969 1970 1971 1972 1973
	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);

1974
unlock:
1975
	hci_dev_unlock(hdev);
1976 1977 1978
	return err;
}

1979
static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
1980
		      u16 len)
1981
{
1982
	struct mgmt_cp_disconnect *cp = data;
1983
	struct mgmt_rp_disconnect rp;
1984
	struct hci_cp_disconnect dc;
1985
	struct pending_cmd *cmd;
1986 1987 1988 1989 1990
	struct hci_conn *conn;
	int err;

	BT_DBG("");

1991 1992 1993 1994
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

1995
	if (!bdaddr_type_is_valid(cp->addr.type))
1996 1997 1998
		return cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				    MGMT_STATUS_INVALID_PARAMS,
				    &rp, sizeof(rp));
1999

2000
	hci_dev_lock(hdev);
2001 2002

	if (!test_bit(HCI_UP, &hdev->flags)) {
2003 2004
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2005 2006 2007
		goto failed;
	}

2008
	if (mgmt_pending_find(MGMT_OP_DISCONNECT, hdev)) {
2009 2010
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2011 2012 2013
		goto failed;
	}

2014
	if (cp->addr.type == BDADDR_BREDR)
2015 2016
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
					       &cp->addr.bdaddr);
2017 2018
	else
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &cp->addr.bdaddr);
2019

2020
	if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
2021 2022
		err = cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
				   MGMT_STATUS_NOT_CONNECTED, &rp, sizeof(rp));
2023 2024 2025
		goto failed;
	}

2026
	cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
2027 2028
	if (!cmd) {
		err = -ENOMEM;
2029
		goto failed;
2030
	}
2031

2032
	dc.handle = cpu_to_le16(conn->handle);
2033
	dc.reason = HCI_ERROR_REMOTE_USER_TERM;
2034 2035 2036

	err = hci_send_cmd(hdev, HCI_OP_DISCONNECT, sizeof(dc), &dc);
	if (err < 0)
2037
		mgmt_pending_remove(cmd);
2038 2039

failed:
2040
	hci_dev_unlock(hdev);
2041 2042 2043
	return err;
}

2044
static u8 link_to_bdaddr(u8 link_type, u8 addr_type)
2045 2046 2047
{
	switch (link_type) {
	case LE_LINK:
2048 2049
		switch (addr_type) {
		case ADDR_LE_DEV_PUBLIC:
2050
			return BDADDR_LE_PUBLIC;
2051

2052
		default:
2053
			/* Fallback to LE Random address type */
2054
			return BDADDR_LE_RANDOM;
2055
		}
2056

2057
	default:
2058
		/* Fallback to BR/EDR type */
2059
		return BDADDR_BREDR;
2060 2061 2062
	}
}

2063 2064
static int get_connections(struct sock *sk, struct hci_dev *hdev, void *data,
			   u16 data_len)
2065 2066
{
	struct mgmt_rp_get_connections *rp;
2067
	struct hci_conn *c;
2068
	size_t rp_len;
2069 2070
	int err;
	u16 i;
2071 2072 2073

	BT_DBG("");

2074
	hci_dev_lock(hdev);
2075

2076
	if (!hdev_is_powered(hdev)) {
2077
		err = cmd_status(sk, hdev->id, MGMT_OP_GET_CONNECTIONS,
2078
				 MGMT_STATUS_NOT_POWERED);
2079 2080 2081
		goto unlock;
	}

2082
	i = 0;
2083 2084
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
		if (test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
2085
			i++;
2086 2087
	}

2088
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2089
	rp = kmalloc(rp_len, GFP_KERNEL);
2090
	if (!rp) {
2091 2092 2093 2094 2095
		err = -ENOMEM;
		goto unlock;
	}

	i = 0;
2096
	list_for_each_entry(c, &hdev->conn_hash.list, list) {
2097 2098
		if (!test_bit(HCI_CONN_MGMT_CONNECTED, &c->flags))
			continue;
2099
		bacpy(&rp->addr[i].bdaddr, &c->dst);
2100
		rp->addr[i].type = link_to_bdaddr(c->type, c->dst_type);
2101
		if (c->type == SCO_LINK || c->type == ESCO_LINK)
2102 2103 2104 2105
			continue;
		i++;
	}

2106
	rp->conn_count = cpu_to_le16(i);
2107

2108 2109
	/* Recalculate length in case of filtered SCO connections, etc */
	rp_len = sizeof(*rp) + (i * sizeof(struct mgmt_addr_info));
2110

2111
	err = cmd_complete(sk, hdev->id, MGMT_OP_GET_CONNECTIONS, 0, rp,
2112
			   rp_len);
2113

2114
	kfree(rp);
2115 2116

unlock:
2117
	hci_dev_unlock(hdev);
2118 2119 2120
	return err;
}

2121
static int send_pin_code_neg_reply(struct sock *sk, struct hci_dev *hdev,
2122
				   struct mgmt_cp_pin_code_neg_reply *cp)
2123 2124 2125 2126
{
	struct pending_cmd *cmd;
	int err;

2127
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_NEG_REPLY, hdev, cp,
2128
			       sizeof(*cp));
2129 2130 2131
	if (!cmd)
		return -ENOMEM;

2132
	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_NEG_REPLY,
2133
			   sizeof(cp->addr.bdaddr), &cp->addr.bdaddr);
2134 2135 2136 2137 2138 2139
	if (err < 0)
		mgmt_pending_remove(cmd);

	return err;
}

2140
static int pin_code_reply(struct sock *sk, struct hci_dev *hdev, void *data,
2141
			  u16 len)
2142
{
2143
	struct hci_conn *conn;
2144
	struct mgmt_cp_pin_code_reply *cp = data;
2145
	struct hci_cp_pin_code_reply reply;
2146
	struct pending_cmd *cmd;
2147 2148 2149 2150
	int err;

	BT_DBG("");

2151
	hci_dev_lock(hdev);
2152

2153
	if (!hdev_is_powered(hdev)) {
2154
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2155
				 MGMT_STATUS_NOT_POWERED);
2156 2157 2158
		goto failed;
	}

2159
	conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &cp->addr.bdaddr);
2160
	if (!conn) {
2161
		err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2162
				 MGMT_STATUS_NOT_CONNECTED);
2163 2164 2165 2166
		goto failed;
	}

	if (conn->pending_sec_level == BT_SECURITY_HIGH && cp->pin_len != 16) {
2167 2168 2169
		struct mgmt_cp_pin_code_neg_reply ncp;

		memcpy(&ncp.addr, &cp->addr, sizeof(ncp.addr));
2170 2171 2172

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

2173
		err = send_pin_code_neg_reply(sk, hdev, &ncp);
2174
		if (err >= 0)
2175
			err = cmd_status(sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
2176
					 MGMT_STATUS_INVALID_PARAMS);
2177 2178 2179 2180

		goto failed;
	}

2181
	cmd = mgmt_pending_add(sk, MGMT_OP_PIN_CODE_REPLY, hdev, data, len);
2182 2183
	if (!cmd) {
		err = -ENOMEM;
2184
		goto failed;
2185
	}
2186

2187
	bacpy(&reply.bdaddr, &cp->addr.bdaddr);
2188
	reply.pin_len = cp->pin_len;
2189
	memcpy(reply.pin_code, cp->pin_code, sizeof(reply.pin_code));
2190 2191 2192

	err = hci_send_cmd(hdev, HCI_OP_PIN_CODE_REPLY, sizeof(reply), &reply);
	if (err < 0)
2193
		mgmt_pending_remove(cmd);
2194 2195

failed:
2196
	hci_dev_unlock(hdev);
2197 2198 2199
	return err;
}

2200 2201
static int set_io_capability(struct sock *sk, struct hci_dev *hdev, void *data,
			     u16 len)
2202
{
2203
	struct mgmt_cp_set_io_capability *cp = data;
2204 2205 2206

	BT_DBG("");

2207
	hci_dev_lock(hdev);
2208 2209 2210 2211

	hdev->io_capability = cp->io_capability;

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

2214
	hci_dev_unlock(hdev);
2215

2216 2217
	return cmd_complete(sk, hdev->id, MGMT_OP_SET_IO_CAPABILITY, 0, NULL,
			    0);
2218 2219
}

2220
static struct pending_cmd *find_pairing(struct hci_conn *conn)
2221 2222
{
	struct hci_dev *hdev = conn->hdev;
2223
	struct pending_cmd *cmd;
2224

2225
	list_for_each_entry(cmd, &hdev->mgmt_pending, list) {
2226 2227 2228 2229 2230 2231 2232 2233 2234 2235 2236 2237 2238 2239 2240 2241 2242
		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;

2243
	bacpy(&rp.addr.bdaddr, &conn->dst);
2244
	rp.addr.type = link_to_bdaddr(conn->type, conn->dst_type);
2245

2246
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_PAIR_DEVICE, status,
2247
		     &rp, sizeof(rp));
2248 2249 2250 2251 2252 2253

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

2254
	hci_conn_drop(conn);
2255

2256
	mgmt_pending_remove(cmd);
2257 2258 2259 2260 2261 2262 2263 2264 2265
}

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

	BT_DBG("status %u", status);

	cmd = find_pairing(conn);
2266
	if (!cmd)
2267
		BT_DBG("Unable to find a pending command");
2268
	else
2269
		pairing_complete(cmd, mgmt_status(status));
2270 2271
}

2272 2273 2274 2275 2276 2277 2278 2279 2280 2281 2282 2283 2284 2285 2286 2287
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));
}

2288
static int pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
2289
		       u16 len)
2290
{
2291
	struct mgmt_cp_pair_device *cp = data;
2292
	struct mgmt_rp_pair_device rp;
2293 2294 2295 2296 2297 2298 2299
	struct pending_cmd *cmd;
	u8 sec_level, auth_type;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

2300 2301 2302 2303
	memset(&rp, 0, sizeof(rp));
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;

2304 2305 2306 2307 2308
	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));

2309
	hci_dev_lock(hdev);
2310

2311
	if (!hdev_is_powered(hdev)) {
2312 2313
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
				   MGMT_STATUS_NOT_POWERED, &rp, sizeof(rp));
2314 2315 2316
		goto unlock;
	}

2317 2318
	sec_level = BT_SECURITY_MEDIUM;
	if (cp->io_cap == 0x03)
2319
		auth_type = HCI_AT_DEDICATED_BONDING;
2320
	else
2321 2322
		auth_type = HCI_AT_DEDICATED_BONDING_MITM;

2323
	if (cp->addr.type == BDADDR_BREDR)
2324 2325
		conn = hci_connect(hdev, ACL_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2326
	else
2327 2328
		conn = hci_connect(hdev, LE_LINK, &cp->addr.bdaddr,
				   cp->addr.type, sec_level, auth_type);
2329

2330
	if (IS_ERR(conn)) {
2331 2332 2333 2334 2335 2336 2337
		int status;

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

2338
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2339
				   status, &rp,
2340
				   sizeof(rp));
2341 2342 2343 2344
		goto unlock;
	}

	if (conn->connect_cfm_cb) {
2345
		hci_conn_drop(conn);
2346
		err = cmd_complete(sk, hdev->id, MGMT_OP_PAIR_DEVICE,
2347
				   MGMT_STATUS_BUSY, &rp, sizeof(rp));
2348 2349 2350
		goto unlock;
	}

2351
	cmd = mgmt_pending_add(sk, MGMT_OP_PAIR_DEVICE, hdev, data, len);
2352 2353
	if (!cmd) {
		err = -ENOMEM;
2354
		hci_conn_drop(conn);
2355 2356 2357
		goto unlock;
	}

2358
	/* For LE, just connecting isn't a proof that the pairing finished */
2359
	if (cp->addr.type == BDADDR_BREDR)
2360
		conn->connect_cfm_cb = pairing_complete_cb;
2361 2362
	else
		conn->connect_cfm_cb = le_connect_complete_cb;
2363

2364 2365 2366 2367 2368 2369
	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 &&
2370
	    hci_conn_security(conn, sec_level, auth_type))
2371 2372 2373 2374 2375
		pairing_complete(cmd, 0);

	err = 0;

unlock:
2376
	hci_dev_unlock(hdev);
2377 2378 2379
	return err;
}

2380 2381
static int cancel_pair_device(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2382
{
2383
	struct mgmt_addr_info *addr = data;
2384 2385 2386 2387 2388 2389 2390 2391
	struct pending_cmd *cmd;
	struct hci_conn *conn;
	int err;

	BT_DBG("");

	hci_dev_lock(hdev);

2392
	if (!hdev_is_powered(hdev)) {
2393
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2394
				 MGMT_STATUS_NOT_POWERED);
2395 2396 2397
		goto unlock;
	}

2398 2399
	cmd = mgmt_pending_find(MGMT_OP_PAIR_DEVICE, hdev);
	if (!cmd) {
2400
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2401
				 MGMT_STATUS_INVALID_PARAMS);
2402 2403 2404 2405 2406 2407
		goto unlock;
	}

	conn = cmd->user_data;

	if (bacmp(&addr->bdaddr, &conn->dst) != 0) {
2408
		err = cmd_status(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE,
2409
				 MGMT_STATUS_INVALID_PARAMS);
2410 2411 2412 2413 2414
		goto unlock;
	}

	pairing_complete(cmd, MGMT_STATUS_CANCELLED);

2415
	err = cmd_complete(sk, hdev->id, MGMT_OP_CANCEL_PAIR_DEVICE, 0,
2416
			   addr, sizeof(*addr));
2417 2418 2419 2420 2421
unlock:
	hci_dev_unlock(hdev);
	return err;
}

2422
static int user_pairing_resp(struct sock *sk, struct hci_dev *hdev,
2423
			     struct mgmt_addr_info *addr, u16 mgmt_op,
2424
			     u16 hci_op, __le32 passkey)
2425 2426
{
	struct pending_cmd *cmd;
2427
	struct hci_conn *conn;
2428 2429
	int err;

2430
	hci_dev_lock(hdev);
2431

2432
	if (!hdev_is_powered(hdev)) {
2433 2434 2435
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_POWERED, addr,
				   sizeof(*addr));
2436
		goto done;
2437 2438
	}

2439 2440
	if (addr->type == BDADDR_BREDR)
		conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK, &addr->bdaddr);
2441
	else
2442
		conn = hci_conn_hash_lookup_ba(hdev, LE_LINK, &addr->bdaddr);
2443 2444

	if (!conn) {
2445 2446 2447
		err = cmd_complete(sk, hdev->id, mgmt_op,
				   MGMT_STATUS_NOT_CONNECTED, addr,
				   sizeof(*addr));
2448 2449
		goto done;
	}
2450

2451
	if (addr->type == BDADDR_LE_PUBLIC || addr->type == BDADDR_LE_RANDOM) {
2452
		/* Continue with pairing via SMP */
2453 2454 2455
		err = smp_user_confirm_reply(conn, mgmt_op, passkey);

		if (!err)
2456 2457 2458
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_SUCCESS, addr,
					   sizeof(*addr));
2459
		else
2460 2461 2462
			err = cmd_complete(sk, hdev->id, mgmt_op,
					   MGMT_STATUS_FAILED, addr,
					   sizeof(*addr));
2463 2464 2465 2466

		goto done;
	}

2467
	cmd = mgmt_pending_add(sk, mgmt_op, hdev, addr, sizeof(*addr));
2468 2469
	if (!cmd) {
		err = -ENOMEM;
2470
		goto done;
2471 2472
	}

2473
	/* Continue with pairing via HCI */
2474 2475 2476
	if (hci_op == HCI_OP_USER_PASSKEY_REPLY) {
		struct hci_cp_user_passkey_reply cp;

2477
		bacpy(&cp.bdaddr, &addr->bdaddr);
2478 2479 2480
		cp.passkey = passkey;
		err = hci_send_cmd(hdev, hci_op, sizeof(cp), &cp);
	} else
2481 2482
		err = hci_send_cmd(hdev, hci_op, sizeof(addr->bdaddr),
				   &addr->bdaddr);
2483

2484 2485
	if (err < 0)
		mgmt_pending_remove(cmd);
2486

2487
done:
2488
	hci_dev_unlock(hdev);
2489 2490 2491
	return err;
}

2492 2493 2494 2495 2496 2497 2498
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("");

2499
	return user_pairing_resp(sk, hdev, &cp->addr,
2500 2501 2502 2503
				MGMT_OP_PIN_CODE_NEG_REPLY,
				HCI_OP_PIN_CODE_NEG_REPLY, 0);
}

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

	BT_DBG("");

	if (len != sizeof(*cp))
2512
		return cmd_status(sk, hdev->id, MGMT_OP_USER_CONFIRM_REPLY,
2513
				  MGMT_STATUS_INVALID_PARAMS);
2514

2515
	return user_pairing_resp(sk, hdev, &cp->addr,
2516 2517
				 MGMT_OP_USER_CONFIRM_REPLY,
				 HCI_OP_USER_CONFIRM_REPLY, 0);
2518 2519
}

2520
static int user_confirm_neg_reply(struct sock *sk, struct hci_dev *hdev,
2521
				  void *data, u16 len)
2522
{
2523
	struct mgmt_cp_user_confirm_neg_reply *cp = data;
2524 2525 2526

	BT_DBG("");

2527
	return user_pairing_resp(sk, hdev, &cp->addr,
2528 2529
				 MGMT_OP_USER_CONFIRM_NEG_REPLY,
				 HCI_OP_USER_CONFIRM_NEG_REPLY, 0);
2530 2531
}

2532 2533
static int user_passkey_reply(struct sock *sk, struct hci_dev *hdev, void *data,
			      u16 len)
2534
{
2535
	struct mgmt_cp_user_passkey_reply *cp = data;
2536 2537 2538

	BT_DBG("");

2539
	return user_pairing_resp(sk, hdev, &cp->addr,
2540 2541
				 MGMT_OP_USER_PASSKEY_REPLY,
				 HCI_OP_USER_PASSKEY_REPLY, cp->passkey);
2542 2543
}

2544
static int user_passkey_neg_reply(struct sock *sk, struct hci_dev *hdev,
2545
				  void *data, u16 len)
2546
{
2547
	struct mgmt_cp_user_passkey_neg_reply *cp = data;
2548 2549 2550

	BT_DBG("");

2551
	return user_pairing_resp(sk, hdev, &cp->addr,
2552 2553
				 MGMT_OP_USER_PASSKEY_NEG_REPLY,
				 HCI_OP_USER_PASSKEY_NEG_REPLY, 0);
2554 2555
}

2556
static void update_name(struct hci_request *req)
2557
{
2558
	struct hci_dev *hdev = req->hdev;
2559 2560
	struct hci_cp_write_local_name cp;

2561
	memcpy(cp.name, hdev->dev_name, sizeof(cp.name));
2562

2563
	hci_req_add(req, HCI_OP_WRITE_LOCAL_NAME, sizeof(cp), &cp);
2564 2565
}

2566 2567 2568 2569 2570 2571 2572 2573 2574 2575 2576 2577 2578 2579 2580 2581 2582 2583 2584 2585 2586 2587 2588 2589 2590 2591 2592 2593
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);
}

2594
static int set_local_name(struct sock *sk, struct hci_dev *hdev, void *data,
2595
			  u16 len)
2596
{
2597
	struct mgmt_cp_set_local_name *cp = data;
2598
	struct pending_cmd *cmd;
2599
	struct hci_request req;
2600 2601 2602 2603
	int err;

	BT_DBG("");

2604
	hci_dev_lock(hdev);
2605

2606 2607 2608 2609 2610 2611 2612 2613 2614 2615 2616
	/* 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;
	}

2617
	memcpy(hdev->short_name, cp->short_name, sizeof(hdev->short_name));
2618

2619
	if (!hdev_is_powered(hdev)) {
2620
		memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));
2621 2622

		err = cmd_complete(sk, hdev->id, MGMT_OP_SET_LOCAL_NAME, 0,
2623
				   data, len);
2624 2625 2626 2627
		if (err < 0)
			goto failed;

		err = mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, data, len,
2628
				 sk);
2629

2630 2631 2632
		goto failed;
	}

2633
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_LOCAL_NAME, hdev, data, len);
2634 2635 2636 2637 2638
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

2639 2640
	memcpy(hdev->dev_name, cp->name, sizeof(hdev->dev_name));

2641
	hci_req_init(&req, hdev);
2642 2643 2644 2645 2646 2647 2648 2649 2650

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

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

2651
	err = hci_req_run(&req, set_name_complete);
2652 2653 2654 2655
	if (err < 0)
		mgmt_pending_remove(cmd);

failed:
2656
	hci_dev_unlock(hdev);
2657 2658 2659
	return err;
}

2660
static int read_local_oob_data(struct sock *sk, struct hci_dev *hdev,
2661
			       void *data, u16 data_len)
2662 2663 2664 2665
{
	struct pending_cmd *cmd;
	int err;

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

2668
	hci_dev_lock(hdev);
2669

2670
	if (!hdev_is_powered(hdev)) {
2671
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2672
				 MGMT_STATUS_NOT_POWERED);
2673 2674 2675
		goto unlock;
	}

2676
	if (!lmp_ssp_capable(hdev)) {
2677
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2678
				 MGMT_STATUS_NOT_SUPPORTED);
2679 2680 2681
		goto unlock;
	}

2682
	if (mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev)) {
2683
		err = cmd_status(sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
2684
				 MGMT_STATUS_BUSY);
2685 2686 2687
		goto unlock;
	}

2688
	cmd = mgmt_pending_add(sk, MGMT_OP_READ_LOCAL_OOB_DATA, hdev, NULL, 0);
2689 2690 2691 2692 2693 2694 2695 2696 2697 2698
	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:
2699
	hci_dev_unlock(hdev);
2700 2701 2702
	return err;
}

2703
static int add_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2704
			       void *data, u16 len)
2705
{
2706
	struct mgmt_cp_add_remote_oob_data *cp = data;
2707
	u8 status;
2708 2709
	int err;

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

2712
	hci_dev_lock(hdev);
2713

2714
	err = hci_add_remote_oob_data(hdev, &cp->addr.bdaddr, cp->hash,
2715
				      cp->randomizer);
2716
	if (err < 0)
2717
		status = MGMT_STATUS_FAILED;
2718
	else
2719
		status = MGMT_STATUS_SUCCESS;
2720

2721
	err = cmd_complete(sk, hdev->id, MGMT_OP_ADD_REMOTE_OOB_DATA, status,
2722
			   &cp->addr, sizeof(cp->addr));
2723

2724
	hci_dev_unlock(hdev);
2725 2726 2727
	return err;
}

2728
static int remove_remote_oob_data(struct sock *sk, struct hci_dev *hdev,
2729
				  void *data, u16 len)
2730
{
2731
	struct mgmt_cp_remove_remote_oob_data *cp = data;
2732
	u8 status;
2733 2734
	int err;

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

2737
	hci_dev_lock(hdev);
2738

2739
	err = hci_remove_remote_oob_data(hdev, &cp->addr.bdaddr);
2740
	if (err < 0)
2741
		status = MGMT_STATUS_INVALID_PARAMS;
2742
	else
2743
		status = MGMT_STATUS_SUCCESS;
2744

2745
	err = cmd_complete(sk, hdev->id, MGMT_OP_REMOVE_REMOTE_OOB_DATA,
2746
			   status, &cp->addr, sizeof(cp->addr));
2747

2748
	hci_dev_unlock(hdev);
2749 2750 2751
	return err;
}

2752 2753 2754 2755 2756 2757 2758 2759 2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772
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;
}

2773 2774 2775 2776 2777 2778 2779 2780 2781 2782 2783 2784 2785 2786 2787 2788 2789 2790
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,
2791
				   DISCOV_LE_TIMEOUT);
2792 2793 2794 2795
		break;

	case DISCOV_TYPE_INTERLEAVED:
		queue_delayed_work(hdev->workqueue, &hdev->le_scan_disable,
2796
				   DISCOV_INTERLEAVED_TIMEOUT);
2797 2798 2799 2800 2801 2802 2803 2804 2805 2806
		break;

	case DISCOV_TYPE_BREDR:
		break;

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

2807
static int start_discovery(struct sock *sk, struct hci_dev *hdev,
2808
			   void *data, u16 len)
2809
{
2810
	struct mgmt_cp_start_discovery *cp = data;
2811
	struct pending_cmd *cmd;
2812 2813 2814 2815 2816 2817
	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 };
2818
	u8 status;
2819 2820
	int err;

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

2823
	hci_dev_lock(hdev);
2824

2825
	if (!hdev_is_powered(hdev)) {
2826
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2827
				 MGMT_STATUS_NOT_POWERED);
2828 2829 2830
		goto failed;
	}

2831 2832 2833 2834 2835 2836
	if (test_bit(HCI_PERIODIC_INQ, &hdev->dev_flags)) {
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_BUSY);
		goto failed;
	}

2837
	if (hdev->discovery.state != DISCOVERY_STOPPED) {
2838
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2839
				 MGMT_STATUS_BUSY);
2840 2841 2842
		goto failed;
	}

2843
	cmd = mgmt_pending_add(sk, MGMT_OP_START_DISCOVERY, hdev, NULL, 0);
2844 2845 2846 2847 2848
	if (!cmd) {
		err = -ENOMEM;
		goto failed;
	}

A
Andre Guedes 已提交
2849 2850
	hdev->discovery.type = cp->type;

2851 2852
	hci_req_init(&req, hdev);

A
Andre Guedes 已提交
2853
	switch (hdev->discovery.type) {
2854
	case DISCOV_TYPE_BREDR:
2855 2856
		status = mgmt_bredr_support(hdev);
		if (status) {
2857
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2858
					 status);
2859 2860 2861 2862
			mgmt_pending_remove(cmd);
			goto failed;
		}

2863 2864 2865 2866 2867 2868 2869 2870 2871 2872 2873
		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));
2874
		inq_cp.length = DISCOV_BREDR_INQUIRY_LEN;
2875
		hci_req_add(&req, HCI_OP_INQUIRY, sizeof(inq_cp), &inq_cp);
2876 2877 2878
		break;

	case DISCOV_TYPE_LE:
2879
	case DISCOV_TYPE_INTERLEAVED:
2880 2881
		status = mgmt_le_support(hdev);
		if (status) {
2882
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
2883
					 status);
2884 2885 2886 2887
			mgmt_pending_remove(cmd);
			goto failed;
		}

2888
		if (hdev->discovery.type == DISCOV_TYPE_INTERLEAVED &&
2889
		    !test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags)) {
2890 2891 2892 2893 2894 2895
			err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
					 MGMT_STATUS_NOT_SUPPORTED);
			mgmt_pending_remove(cmd);
			goto failed;
		}

2896
		if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
2897 2898 2899 2900 2901 2902 2903 2904 2905 2906 2907 2908 2909 2910 2911
			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;
2912 2913
		param_cp.interval = cpu_to_le16(DISCOV_LE_SCAN_INT);
		param_cp.window = cpu_to_le16(DISCOV_LE_SCAN_WIN);
2914 2915 2916 2917
		if (bacmp(&hdev->bdaddr, BDADDR_ANY))
			param_cp.own_address_type = ADDR_LE_DEV_PUBLIC;
		else
			param_cp.own_address_type = ADDR_LE_DEV_RANDOM;
2918 2919 2920 2921 2922 2923 2924 2925
		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);
2926 2927
		break;

2928
	default:
2929 2930 2931 2932
		err = cmd_status(sk, hdev->id, MGMT_OP_START_DISCOVERY,
				 MGMT_STATUS_INVALID_PARAMS);
		mgmt_pending_remove(cmd);
		goto failed;
2933
	}
2934

2935
	err = hci_req_run(&req, start_discovery_complete);
2936 2937
	if (err < 0)
		mgmt_pending_remove(cmd);
2938 2939
	else
		hci_discovery_set_state(hdev, DISCOVERY_STARTING);
2940 2941

failed:
2942
	hci_dev_unlock(hdev);
2943 2944 2945
	return err;
}

2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961
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;
}

2962 2963 2964 2965 2966 2967 2968 2969 2970 2971 2972 2973 2974 2975 2976 2977 2978
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);
}

2979
static int stop_discovery(struct sock *sk, struct hci_dev *hdev, void *data,
2980
			  u16 len)
2981
{
2982
	struct mgmt_cp_stop_discovery *mgmt_cp = data;
2983
	struct pending_cmd *cmd;
2984 2985
	struct hci_cp_remote_name_req_cancel cp;
	struct inquiry_entry *e;
2986 2987
	struct hci_request req;
	struct hci_cp_le_set_scan_enable enable_cp;
2988 2989
	int err;

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

2992
	hci_dev_lock(hdev);
2993

2994
	if (!hci_discovery_active(hdev)) {
2995
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
2996 2997
				   MGMT_STATUS_REJECTED, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
2998 2999 3000 3001
		goto unlock;
	}

	if (hdev->discovery.type != mgmt_cp->type) {
3002
		err = cmd_complete(sk, hdev->id, MGMT_OP_STOP_DISCOVERY,
3003 3004
				   MGMT_STATUS_INVALID_PARAMS, &mgmt_cp->type,
				   sizeof(mgmt_cp->type));
3005
		goto unlock;
3006 3007
	}

3008
	cmd = mgmt_pending_add(sk, MGMT_OP_STOP_DISCOVERY, hdev, NULL, 0);
3009 3010
	if (!cmd) {
		err = -ENOMEM;
3011 3012 3013
		goto unlock;
	}

3014 3015
	hci_req_init(&req, hdev);

3016 3017
	switch (hdev->discovery.state) {
	case DISCOVERY_FINDING:
3018 3019 3020 3021 3022 3023 3024 3025 3026 3027
		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);
		}
3028

3029 3030 3031 3032
		break;

	case DISCOVERY_RESOLVING:
		e = hci_inquiry_cache_lookup_resolve(hdev, BDADDR_ANY,
3033
						     NAME_PENDING);
3034
		if (!e) {
3035
			mgmt_pending_remove(cmd);
3036 3037 3038 3039 3040 3041 3042
			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;
		}
3043

3044
		bacpy(&cp.bdaddr, &e->data.bdaddr);
3045 3046
		hci_req_add(&req, HCI_OP_REMOTE_NAME_REQ_CANCEL, sizeof(cp),
			    &cp);
3047 3048 3049 3050 3051

		break;

	default:
		BT_DBG("unknown discovery state %u", hdev->discovery.state);
3052 3053 3054 3055 3056 3057

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

3060
	err = hci_req_run(&req, stop_discovery_complete);
3061 3062
	if (err < 0)
		mgmt_pending_remove(cmd);
3063 3064
	else
		hci_discovery_set_state(hdev, DISCOVERY_STOPPING);
3065

3066
unlock:
3067
	hci_dev_unlock(hdev);
3068 3069 3070
	return err;
}

3071
static int confirm_name(struct sock *sk, struct hci_dev *hdev, void *data,
3072
			u16 len)
3073
{
3074
	struct mgmt_cp_confirm_name *cp = data;
3075 3076 3077
	struct inquiry_entry *e;
	int err;

3078
	BT_DBG("%s", hdev->name);
3079 3080 3081

	hci_dev_lock(hdev);

3082
	if (!hci_discovery_active(hdev)) {
3083
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3084
				 MGMT_STATUS_FAILED);
3085 3086 3087
		goto failed;
	}

3088
	e = hci_inquiry_cache_lookup_unknown(hdev, &cp->addr.bdaddr);
3089
	if (!e) {
3090
		err = cmd_status(sk, hdev->id, MGMT_OP_CONFIRM_NAME,
3091
				 MGMT_STATUS_INVALID_PARAMS);
3092 3093 3094 3095 3096 3097 3098 3099
		goto failed;
	}

	if (cp->name_known) {
		e->name_state = NAME_KNOWN;
		list_del(&e->list);
	} else {
		e->name_state = NAME_NEEDED;
3100
		hci_inquiry_cache_update_resolve(hdev, e);
3101 3102
	}

3103 3104
	err = cmd_complete(sk, hdev->id, MGMT_OP_CONFIRM_NAME, 0, &cp->addr,
			   sizeof(cp->addr));
3105 3106 3107 3108 3109 3110

failed:
	hci_dev_unlock(hdev);
	return err;
}

3111
static int block_device(struct sock *sk, struct hci_dev *hdev, void *data,
3112
			u16 len)
3113
{
3114
	struct mgmt_cp_block_device *cp = data;
3115
	u8 status;
3116 3117
	int err;

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

3120
	if (!bdaddr_type_is_valid(cp->addr.type))
3121 3122 3123
		return cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3124

3125
	hci_dev_lock(hdev);
3126

3127
	err = hci_blacklist_add(hdev, &cp->addr.bdaddr, cp->addr.type);
3128
	if (err < 0)
3129
		status = MGMT_STATUS_FAILED;
3130
	else
3131
		status = MGMT_STATUS_SUCCESS;
3132

3133
	err = cmd_complete(sk, hdev->id, MGMT_OP_BLOCK_DEVICE, status,
3134
			   &cp->addr, sizeof(cp->addr));
3135

3136
	hci_dev_unlock(hdev);
3137 3138 3139 3140

	return err;
}

3141
static int unblock_device(struct sock *sk, struct hci_dev *hdev, void *data,
3142
			  u16 len)
3143
{
3144
	struct mgmt_cp_unblock_device *cp = data;
3145
	u8 status;
3146 3147
	int err;

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

3150
	if (!bdaddr_type_is_valid(cp->addr.type))
3151 3152 3153
		return cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE,
				    MGMT_STATUS_INVALID_PARAMS,
				    &cp->addr, sizeof(cp->addr));
3154

3155
	hci_dev_lock(hdev);
3156

3157
	err = hci_blacklist_del(hdev, &cp->addr.bdaddr, cp->addr.type);
3158
	if (err < 0)
3159
		status = MGMT_STATUS_INVALID_PARAMS;
3160
	else
3161
		status = MGMT_STATUS_SUCCESS;
3162

3163
	err = cmd_complete(sk, hdev->id, MGMT_OP_UNBLOCK_DEVICE, status,
3164
			   &cp->addr, sizeof(cp->addr));
3165

3166
	hci_dev_unlock(hdev);
3167 3168 3169 3170

	return err;
}

3171 3172 3173 3174
static int set_device_id(struct sock *sk, struct hci_dev *hdev, void *data,
			 u16 len)
{
	struct mgmt_cp_set_device_id *cp = data;
3175
	struct hci_request req;
3176
	int err;
3177
	__u16 source;
3178 3179 3180

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

3181 3182 3183 3184 3185 3186
	source = __le16_to_cpu(cp->source);

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

3187 3188
	hci_dev_lock(hdev);

3189
	hdev->devid_source = source;
3190 3191 3192 3193 3194 3195
	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);

3196 3197 3198
	hci_req_init(&req, hdev);
	update_eir(&req);
	hci_req_run(&req, NULL);
3199 3200 3201 3202 3203 3204

	hci_dev_unlock(hdev);

	return err;
}

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
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;
3231
	u8 val, enabled, status;
3232 3233 3234 3235
	int err;

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

3236 3237
	status = mgmt_le_support(hdev);
	if (status)
3238
		return cmd_status(sk, hdev->id, MGMT_OP_SET_ADVERTISING,
3239
				  status);
3240 3241 3242 3243 3244 3245 3246 3247

	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;
3248
	enabled = test_bit(HCI_ADVERTISING, &hdev->dev_flags);
3249 3250 3251 3252

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

3253 3254
		if (val != test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
			change_bit(HCI_ADVERTISING, &hdev->dev_flags);
3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270 3271 3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293
			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;
}

3294 3295 3296 3297 3298 3299 3300 3301
static int set_static_address(struct sock *sk, struct hci_dev *hdev,
			      void *data, u16 len)
{
	struct mgmt_cp_set_static_address *cp = data;
	int err;

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

3302
	if (!lmp_le_capable(hdev))
3303
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
3304
				  MGMT_STATUS_NOT_SUPPORTED);
3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319 3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333

	if (hdev_is_powered(hdev))
		return cmd_status(sk, hdev->id, MGMT_OP_SET_STATIC_ADDRESS,
				  MGMT_STATUS_REJECTED);

	if (bacmp(&cp->bdaddr, BDADDR_ANY)) {
		if (!bacmp(&cp->bdaddr, BDADDR_NONE))
			return cmd_status(sk, hdev->id,
					  MGMT_OP_SET_STATIC_ADDRESS,
					  MGMT_STATUS_INVALID_PARAMS);

		/* Two most significant bits shall be set */
		if ((cp->bdaddr.b[5] & 0xc0) != 0xc0)
			return cmd_status(sk, hdev->id,
					  MGMT_OP_SET_STATIC_ADDRESS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

	hci_dev_lock(hdev);

	bacpy(&hdev->static_addr, &cp->bdaddr);

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

	hci_dev_unlock(hdev);

	return err;
}

3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349
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 {
3350 3351 3352 3353 3354 3355 3356
		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);

3357 3358 3359 3360 3361 3362 3363 3364 3365 3366
		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);
}

3367
static int set_fast_connectable(struct sock *sk, struct hci_dev *hdev,
3368
				void *data, u16 len)
3369
{
3370
	struct mgmt_mode *cp = data;
3371 3372
	struct pending_cmd *cmd;
	struct hci_request req;
3373 3374
	int err;

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

3377 3378
	if (!test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags) ||
	    hdev->hci_ver < BLUETOOTH_VER_1_2)
3379 3380 3381
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_NOT_SUPPORTED);

3382 3383 3384 3385
	if (cp->val != 0x00 && cp->val != 0x01)
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
				  MGMT_STATUS_INVALID_PARAMS);

3386
	if (!hdev_is_powered(hdev))
3387
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3388
				  MGMT_STATUS_NOT_POWERED);
3389 3390

	if (!test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
3391
		return cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3392
				  MGMT_STATUS_REJECTED);
3393 3394 3395

	hci_dev_lock(hdev);

3396 3397 3398 3399 3400 3401
	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;
	}

3402 3403 3404 3405 3406 3407
	if (!!cp->val == test_bit(HCI_FAST_CONNECTABLE, &hdev->dev_flags)) {
		err = send_settings_rsp(sk, MGMT_OP_SET_FAST_CONNECTABLE,
					hdev);
		goto unlock;
	}

3408 3409 3410 3411 3412
	cmd = mgmt_pending_add(sk, MGMT_OP_SET_FAST_CONNECTABLE, hdev,
			       data, len);
	if (!cmd) {
		err = -ENOMEM;
		goto unlock;
3413 3414
	}

3415 3416
	hci_req_init(&req, hdev);

3417
	write_fast_connectable(&req, cp->val);
3418 3419

	err = hci_req_run(&req, fast_connectable_complete);
3420
	if (err < 0) {
3421
		err = cmd_status(sk, hdev->id, MGMT_OP_SET_FAST_CONNECTABLE,
3422
				 MGMT_STATUS_FAILED);
3423
		mgmt_pending_remove(cmd);
3424 3425
	}

3426
unlock:
3427
	hci_dev_unlock(hdev);
3428

3429 3430 3431
	return err;
}

3432 3433 3434 3435 3436 3437 3438 3439 3440 3441 3442 3443 3444 3445 3446 3447 3448 3449 3450 3451 3452 3453 3454 3455 3456 3457 3458 3459 3460 3461 3462 3463 3464 3465 3466 3467 3468 3469 3470 3471 3472 3473 3474 3475 3476 3477 3478 3479 3480 3481 3482 3483 3484 3485 3486 3487 3488 3489 3490 3491 3492 3493 3494 3495 3496 3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510 3511 3512 3513 3514 3515 3516 3517 3518 3519 3520 3521 3522 3523 3524 3525 3526 3527 3528 3529 3530 3531 3532 3533 3534 3535 3536 3537 3538 3539 3540 3541 3542 3543 3544 3545 3546
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;
}

3547 3548
static bool ltk_is_valid(struct mgmt_ltk_info *key)
{
3549 3550
	if (key->authenticated != 0x00 && key->authenticated != 0x01)
		return false;
3551 3552
	if (key->master != 0x00 && key->master != 0x01)
		return false;
3553 3554
	if (!bdaddr_type_is_le(key->addr.type))
		return false;
3555 3556 3557
	return true;
}

3558
static int load_long_term_keys(struct sock *sk, struct hci_dev *hdev,
3559
			       void *cp_data, u16 len)
3560 3561 3562
{
	struct mgmt_cp_load_long_term_keys *cp = cp_data;
	u16 key_count, expected_len;
3563
	int i, err;
3564

3565 3566 3567 3568 3569 3570
	BT_DBG("request for %s", hdev->name);

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

3571
	key_count = __le16_to_cpu(cp->key_count);
3572 3573 3574 3575 3576

	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",
3577
		       len, expected_len);
3578
		return cmd_status(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS,
3579
				  MGMT_STATUS_INVALID_PARAMS);
3580 3581
	}

3582
	BT_DBG("%s key_count %u", hdev->name, key_count);
3583

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

3587
		if (!ltk_is_valid(key))
3588 3589 3590 3591 3592
			return cmd_status(sk, hdev->id,
					  MGMT_OP_LOAD_LONG_TERM_KEYS,
					  MGMT_STATUS_INVALID_PARAMS);
	}

3593 3594 3595 3596 3597 3598 3599 3600 3601 3602 3603 3604 3605
	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;

3606
		hci_add_ltk(hdev, &key->addr.bdaddr,
3607
			    bdaddr_to_le(key->addr.type),
3608 3609
			    type, 0, key->authenticated, key->val,
			    key->enc_size, key->ediv, key->rand);
3610 3611
	}

3612 3613 3614
	err = cmd_complete(sk, hdev->id, MGMT_OP_LOAD_LONG_TERM_KEYS, 0,
			   NULL, 0);

3615 3616
	hci_dev_unlock(hdev);

3617
	return err;
3618 3619
}

3620
static const struct mgmt_handler {
3621 3622
	int (*func) (struct sock *sk, struct hci_dev *hdev, void *data,
		     u16 data_len);
3623 3624
	bool var_len;
	size_t data_len;
3625 3626
} mgmt_handlers[] = {
	{ NULL }, /* 0x0000 (no command) */
3627 3628 3629 3630 3631 3632 3633 3634 3635 3636 3637 3638 3639 3640 3641 3642 3643 3644 3645 3646 3647 3648 3649 3650 3651 3652 3653 3654 3655 3656 3657 3658 3659 3660 3661 3662 3663 3664 3665
	{ 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 },
3666
	{ set_device_id,          false, MGMT_SET_DEVICE_ID_SIZE },
3667
	{ set_advertising,        false, MGMT_SETTING_SIZE },
3668
	{ set_bredr,              false, MGMT_SETTING_SIZE },
3669
	{ set_static_address,     false, MGMT_SET_STATIC_ADDRESS_SIZE },
3670 3671 3672
};


3673 3674
int mgmt_control(struct sock *sk, struct msghdr *msg, size_t msglen)
{
3675 3676
	void *buf;
	u8 *cp;
3677
	struct mgmt_hdr *hdr;
3678
	u16 opcode, index, len;
3679
	struct hci_dev *hdev = NULL;
3680
	const struct mgmt_handler *handler;
3681 3682 3683 3684 3685 3686 3687
	int err;

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

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

3688
	buf = kmalloc(msglen, GFP_KERNEL);
3689 3690 3691 3692 3693 3694 3695 3696
	if (!buf)
		return -ENOMEM;

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

3697
	hdr = buf;
3698 3699 3700
	opcode = __le16_to_cpu(hdr->opcode);
	index = __le16_to_cpu(hdr->index);
	len = __le16_to_cpu(hdr->len);
3701 3702 3703 3704 3705 3706

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

3707
	if (index != MGMT_INDEX_NONE) {
3708 3709 3710
		hdev = hci_dev_get(index);
		if (!hdev) {
			err = cmd_status(sk, index, opcode,
3711
					 MGMT_STATUS_INVALID_INDEX);
3712 3713
			goto done;
		}
3714 3715 3716 3717 3718 3719

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

3722
	if (opcode >= ARRAY_SIZE(mgmt_handlers) ||
3723
	    mgmt_handlers[opcode].func == NULL) {
3724
		BT_DBG("Unknown op %u", opcode);
3725
		err = cmd_status(sk, index, opcode,
3726
				 MGMT_STATUS_UNKNOWN_COMMAND);
3727 3728 3729 3730
		goto done;
	}

	if ((hdev && opcode < MGMT_OP_READ_INFO) ||
3731
	    (!hdev && opcode >= MGMT_OP_READ_INFO)) {
3732
		err = cmd_status(sk, index, opcode,
3733
				 MGMT_STATUS_INVALID_INDEX);
3734
		goto done;
3735 3736
	}

3737 3738 3739
	handler = &mgmt_handlers[opcode];

	if ((handler->var_len && len < handler->data_len) ||
3740
	    (!handler->var_len && len != handler->data_len)) {
3741
		err = cmd_status(sk, index, opcode,
3742
				 MGMT_STATUS_INVALID_PARAMS);
3743 3744 3745
		goto done;
	}

3746 3747 3748 3749 3750
	if (hdev)
		mgmt_init_hdev(sk, hdev);

	cp = buf + sizeof(*hdr);

3751
	err = handler->func(sk, hdev, cp, len);
3752 3753 3754
	if (err < 0)
		goto done;

3755 3756 3757
	err = msglen;

done:
3758 3759 3760
	if (hdev)
		hci_dev_put(hdev);

3761 3762 3763
	kfree(buf);
	return err;
}
3764

3765
int mgmt_index_added(struct hci_dev *hdev)
3766
{
3767 3768 3769
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3770
	return mgmt_event(MGMT_EV_INDEX_ADDED, hdev, NULL, 0, NULL);
3771 3772
}

3773
int mgmt_index_removed(struct hci_dev *hdev)
3774
{
3775
	u8 status = MGMT_STATUS_INVALID_INDEX;
3776

3777 3778 3779
	if (!mgmt_valid_hdev(hdev))
		return -ENOTSUPP;

3780
	mgmt_pending_foreach(0, hdev, cmd_status_rsp, &status);
3781

3782
	return mgmt_event(MGMT_EV_INDEX_REMOVED, hdev, NULL, 0, NULL);
3783 3784
}

3785
static void set_bredr_scan(struct hci_request *req)
3786
{
3787
	struct hci_dev *hdev = req->hdev;
3788 3789
	u8 scan = 0;

3790 3791 3792 3793 3794 3795
	/* 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);

3796 3797 3798 3799 3800
	if (test_bit(HCI_CONNECTABLE, &hdev->dev_flags))
		scan |= SCAN_PAGE;
	if (test_bit(HCI_DISCOVERABLE, &hdev->dev_flags))
		scan |= SCAN_INQUIRY;

3801 3802
	if (scan)
		hci_req_add(req, HCI_OP_WRITE_SCAN_ENABLE, 1, &scan);
3803 3804
}

3805 3806 3807 3808 3809 3810 3811 3812 3813 3814 3815 3816 3817 3818 3819 3820 3821 3822
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);
}

3823
static int powered_update_hci(struct hci_dev *hdev)
3824
{
3825
	struct hci_request req;
3826
	u8 link_sec;
3827

3828 3829
	hci_req_init(&req, hdev);

3830 3831 3832
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags) &&
	    !lmp_host_ssp_capable(hdev)) {
		u8 ssp = 1;
3833

3834
		hci_req_add(&req, HCI_OP_WRITE_SSP_MODE, 1, &ssp);
3835
	}
3836

3837 3838
	if (test_bit(HCI_LE_ENABLED, &hdev->dev_flags) &&
	    lmp_bredr_capable(hdev)) {
3839
		struct hci_cp_write_le_host_supported cp;
3840

3841 3842
		cp.le = 1;
		cp.simul = lmp_le_br_capable(hdev);
3843

3844 3845 3846 3847 3848
		/* 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))
3849 3850
			hci_req_add(&req, HCI_OP_WRITE_LE_HOST_SUPPORTED,
				    sizeof(cp), &cp);
3851 3852 3853

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

3856 3857 3858 3859 3860 3861 3862
	if (lmp_le_capable(hdev)) {
		/* Set random address to static address if configured */
		if (bacmp(&hdev->static_addr, BDADDR_ANY))
			hci_req_add(&req, HCI_OP_LE_SET_RANDOM_ADDR, 6,
				    &hdev->static_addr);
	}

3863
	if (test_bit(HCI_ADVERTISING, &hdev->dev_flags)) {
3864 3865 3866 3867 3868
		u8 adv = 0x01;

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

3869 3870
	link_sec = test_bit(HCI_LINK_SECURITY, &hdev->dev_flags);
	if (link_sec != test_bit(HCI_AUTH, &hdev->flags))
3871 3872
		hci_req_add(&req, HCI_OP_WRITE_AUTH_ENABLE,
			    sizeof(link_sec), &link_sec);
3873

3874
	if (lmp_bredr_capable(hdev)) {
3875 3876
		if (test_bit(HCI_BREDR_ENABLED, &hdev->dev_flags))
			set_bredr_scan(&req);
3877
		update_class(&req);
3878
		update_name(&req);
3879
		update_eir(&req);
3880
	}
3881

3882
	return hci_req_run(&req, powered_complete);
3883
}
3884

3885 3886 3887
int mgmt_powered(struct hci_dev *hdev, u8 powered)
{
	struct cmd_lookup match = { NULL, hdev };
3888 3889
	u8 status_not_powered = MGMT_STATUS_NOT_POWERED;
	u8 zero_cod[] = { 0, 0, 0 };
3890
	int err;
3891

3892 3893 3894 3895
	if (!test_bit(HCI_MGMT, &hdev->dev_flags))
		return 0;

	if (powered) {
3896 3897
		if (powered_update_hci(hdev) == 0)
			return 0;
3898

3899 3900 3901
		mgmt_pending_foreach(MGMT_OP_SET_POWERED, hdev, settings_rsp,
				     &match);
		goto new_settings;
3902 3903
	}

3904 3905 3906 3907 3908 3909 3910 3911
	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:
3912
	err = new_settings(hdev, match.sk);
3913 3914 3915 3916

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

3917
	return err;
3918
}
3919

3920 3921 3922 3923 3924 3925 3926 3927 3928 3929 3930 3931 3932 3933 3934 3935 3936 3937 3938 3939 3940
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;
}

3941
int mgmt_discoverable(struct hci_dev *hdev, u8 discoverable)
3942
{
3943
	struct cmd_lookup match = { NULL, hdev };
3944 3945
	bool changed = false;
	int err = 0;
3946

3947 3948 3949 3950 3951 3952 3953
	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;
	}
3954

3955
	mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev, settings_rsp,
3956
			     &match);
3957

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

3961 3962 3963
	if (match.sk)
		sock_put(match.sk);

3964
	return err;
3965
}
3966

3967
int mgmt_connectable(struct hci_dev *hdev, u8 connectable)
3968
{
3969
	struct pending_cmd *cmd;
3970 3971
	bool changed = false;
	int err = 0;
3972

3973 3974 3975 3976 3977 3978 3979
	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;
	}
3980

3981
	cmd = mgmt_pending_find(MGMT_OP_SET_CONNECTABLE, hdev);
3982

3983
	if (changed)
3984
		err = new_settings(hdev, cmd ? cmd->sk : NULL);
3985

3986
	return err;
3987
}
3988

3989
int mgmt_write_scan_failed(struct hci_dev *hdev, u8 scan, u8 status)
3990
{
3991 3992
	u8 mgmt_err = mgmt_status(status);

3993
	if (scan & SCAN_PAGE)
3994
		mgmt_pending_foreach(MGMT_OP_SET_CONNECTABLE, hdev,
3995
				     cmd_status_rsp, &mgmt_err);
3996 3997

	if (scan & SCAN_INQUIRY)
3998
		mgmt_pending_foreach(MGMT_OP_SET_DISCOVERABLE, hdev,
3999
				     cmd_status_rsp, &mgmt_err);
4000 4001 4002 4003

	return 0;
}

4004 4005
int mgmt_new_link_key(struct hci_dev *hdev, struct link_key *key,
		      bool persistent)
4006
{
4007
	struct mgmt_ev_new_link_key ev;
4008

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

4011
	ev.store_hint = persistent;
4012
	bacpy(&ev.key.addr.bdaddr, &key->bdaddr);
4013
	ev.key.addr.type = BDADDR_BREDR;
4014
	ev.key.type = key->type;
4015
	memcpy(ev.key.val, key->val, HCI_LINK_KEY_SIZE);
4016
	ev.key.pin_len = key->pin_len;
4017

4018
	return mgmt_event(MGMT_EV_NEW_LINK_KEY, hdev, &ev, sizeof(ev), NULL);
4019
}
4020

4021 4022 4023 4024 4025 4026 4027 4028
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);
4029
	ev.key.addr.type = link_to_bdaddr(LE_LINK, key->bdaddr_type);
4030 4031 4032 4033 4034 4035 4036 4037 4038 4039
	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));

4040 4041
	return mgmt_event(MGMT_EV_NEW_LONG_TERM_KEY, hdev, &ev, sizeof(ev),
			  NULL);
4042 4043
}

4044
int mgmt_device_connected(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4045 4046
			  u8 addr_type, u32 flags, u8 *name, u8 name_len,
			  u8 *dev_class)
4047
{
4048 4049 4050
	char buf[512];
	struct mgmt_ev_device_connected *ev = (void *) buf;
	u16 eir_len = 0;
4051

4052
	bacpy(&ev->addr.bdaddr, bdaddr);
4053
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4054

4055
	ev->flags = __cpu_to_le32(flags);
4056

4057 4058
	if (name_len > 0)
		eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE,
4059
					  name, name_len);
4060 4061

	if (dev_class && memcmp(dev_class, "\0\0\0", 3) != 0)
4062
		eir_len = eir_append_data(ev->eir, eir_len,
4063
					  EIR_CLASS_OF_DEV, dev_class, 3);
4064

4065
	ev->eir_len = cpu_to_le16(eir_len);
4066 4067

	return mgmt_event(MGMT_EV_DEVICE_CONNECTED, hdev, buf,
4068
			  sizeof(*ev) + eir_len, NULL);
4069 4070
}

4071 4072
static void disconnect_rsp(struct pending_cmd *cmd, void *data)
{
4073
	struct mgmt_cp_disconnect *cp = cmd->param;
4074
	struct sock **sk = data;
4075
	struct mgmt_rp_disconnect rp;
4076

4077 4078
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4079

4080
	cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT, 0, &rp,
4081
		     sizeof(rp));
4082 4083 4084 4085

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

4086
	mgmt_pending_remove(cmd);
4087 4088
}

4089
static void unpair_device_rsp(struct pending_cmd *cmd, void *data)
4090
{
4091
	struct hci_dev *hdev = data;
4092 4093
	struct mgmt_cp_unpair_device *cp = cmd->param;
	struct mgmt_rp_unpair_device rp;
4094 4095

	memset(&rp, 0, sizeof(rp));
4096 4097
	bacpy(&rp.addr.bdaddr, &cp->addr.bdaddr);
	rp.addr.type = cp->addr.type;
4098

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

4101
	cmd_complete(cmd->sk, cmd->index, cmd->opcode, 0, &rp, sizeof(rp));
4102 4103 4104 4105

	mgmt_pending_remove(cmd);
}

4106
int mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
4107
			     u8 link_type, u8 addr_type, u8 reason)
4108
{
4109
	struct mgmt_ev_device_disconnected ev;
4110 4111 4112
	struct sock *sk = NULL;
	int err;

4113
	mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
4114

4115 4116 4117
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
	ev.reason = reason;
4118

4119
	err = mgmt_event(MGMT_EV_DEVICE_DISCONNECTED, hdev, &ev, sizeof(ev),
4120
			 sk);
4121 4122

	if (sk)
4123
		sock_put(sk);
4124

4125
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
4126
			     hdev);
4127

4128 4129 4130
	return err;
}

4131
int mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
4132
			   u8 link_type, u8 addr_type, u8 status)
4133
{
4134
	struct mgmt_rp_disconnect rp;
4135 4136 4137
	struct pending_cmd *cmd;
	int err;

4138 4139 4140
	mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
			     hdev);

4141
	cmd = mgmt_pending_find(MGMT_OP_DISCONNECT, hdev);
4142 4143 4144
	if (!cmd)
		return -ENOENT;

4145
	bacpy(&rp.addr.bdaddr, bdaddr);
4146
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4147

4148
	err = cmd_complete(cmd->sk, cmd->index, MGMT_OP_DISCONNECT,
4149
			   mgmt_status(status), &rp, sizeof(rp));
4150

4151
	mgmt_pending_remove(cmd);
4152 4153

	return err;
4154
}
4155

4156
int mgmt_connect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4157
			u8 addr_type, u8 status)
4158 4159 4160
{
	struct mgmt_ev_connect_failed ev;

4161
	bacpy(&ev.addr.bdaddr, bdaddr);
4162
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4163
	ev.status = mgmt_status(status);
4164

4165
	return mgmt_event(MGMT_EV_CONNECT_FAILED, hdev, &ev, sizeof(ev), NULL);
4166
}
4167

4168
int mgmt_pin_code_request(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 secure)
4169 4170 4171
{
	struct mgmt_ev_pin_code_request ev;

4172
	bacpy(&ev.addr.bdaddr, bdaddr);
4173
	ev.addr.type = BDADDR_BREDR;
4174
	ev.secure = secure;
4175

4176
	return mgmt_event(MGMT_EV_PIN_CODE_REQUEST, hdev, &ev, sizeof(ev),
4177
			  NULL);
4178 4179
}

4180
int mgmt_pin_code_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4181
				 u8 status)
4182 4183
{
	struct pending_cmd *cmd;
4184
	struct mgmt_rp_pin_code_reply rp;
4185 4186
	int err;

4187
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_REPLY, hdev);
4188 4189 4190
	if (!cmd)
		return -ENOENT;

4191
	bacpy(&rp.addr.bdaddr, bdaddr);
4192
	rp.addr.type = BDADDR_BREDR;
4193

4194
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_REPLY,
4195
			   mgmt_status(status), &rp, sizeof(rp));
4196

4197
	mgmt_pending_remove(cmd);
4198 4199 4200 4201

	return err;
}

4202
int mgmt_pin_code_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4203
				     u8 status)
4204 4205
{
	struct pending_cmd *cmd;
4206
	struct mgmt_rp_pin_code_reply rp;
4207 4208
	int err;

4209
	cmd = mgmt_pending_find(MGMT_OP_PIN_CODE_NEG_REPLY, hdev);
4210 4211 4212
	if (!cmd)
		return -ENOENT;

4213
	bacpy(&rp.addr.bdaddr, bdaddr);
4214
	rp.addr.type = BDADDR_BREDR;
4215

4216
	err = cmd_complete(cmd->sk, hdev->id, MGMT_OP_PIN_CODE_NEG_REPLY,
4217
			   mgmt_status(status), &rp, sizeof(rp));
4218

4219
	mgmt_pending_remove(cmd);
4220 4221 4222

	return err;
}
4223

4224
int mgmt_user_confirm_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4225 4226
			      u8 link_type, u8 addr_type, __le32 value,
			      u8 confirm_hint)
4227 4228 4229
{
	struct mgmt_ev_user_confirm_request ev;

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

4232
	bacpy(&ev.addr.bdaddr, bdaddr);
4233
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4234
	ev.confirm_hint = confirm_hint;
4235
	ev.value = value;
4236

4237
	return mgmt_event(MGMT_EV_USER_CONFIRM_REQUEST, hdev, &ev, sizeof(ev),
4238
			  NULL);
4239 4240
}

4241
int mgmt_user_passkey_request(struct hci_dev *hdev, bdaddr_t *bdaddr,
4242
			      u8 link_type, u8 addr_type)
4243 4244 4245 4246 4247
{
	struct mgmt_ev_user_passkey_request ev;

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

4248
	bacpy(&ev.addr.bdaddr, bdaddr);
4249
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4250 4251

	return mgmt_event(MGMT_EV_USER_PASSKEY_REQUEST, hdev, &ev, sizeof(ev),
4252
			  NULL);
4253 4254
}

4255
static int user_pairing_resp_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4256 4257
				      u8 link_type, u8 addr_type, u8 status,
				      u8 opcode)
4258 4259 4260 4261 4262
{
	struct pending_cmd *cmd;
	struct mgmt_rp_user_confirm_reply rp;
	int err;

4263
	cmd = mgmt_pending_find(opcode, hdev);
4264 4265 4266
	if (!cmd)
		return -ENOENT;

4267
	bacpy(&rp.addr.bdaddr, bdaddr);
4268
	rp.addr.type = link_to_bdaddr(link_type, addr_type);
4269
	err = cmd_complete(cmd->sk, hdev->id, opcode, mgmt_status(status),
4270
			   &rp, sizeof(rp));
4271

4272
	mgmt_pending_remove(cmd);
4273 4274 4275 4276

	return err;
}

4277
int mgmt_user_confirm_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4278
				     u8 link_type, u8 addr_type, u8 status)
4279
{
4280
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4281
					  status, MGMT_OP_USER_CONFIRM_REPLY);
4282 4283
}

4284
int mgmt_user_confirm_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4285
					 u8 link_type, u8 addr_type, u8 status)
4286
{
4287
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4288 4289
					  status,
					  MGMT_OP_USER_CONFIRM_NEG_REPLY);
4290
}
4291

4292
int mgmt_user_passkey_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4293
				     u8 link_type, u8 addr_type, u8 status)
4294
{
4295
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4296
					  status, MGMT_OP_USER_PASSKEY_REPLY);
4297 4298
}

4299
int mgmt_user_passkey_neg_reply_complete(struct hci_dev *hdev, bdaddr_t *bdaddr,
4300
					 u8 link_type, u8 addr_type, u8 status)
4301
{
4302
	return user_pairing_resp_complete(hdev, bdaddr, link_type, addr_type,
4303 4304
					  status,
					  MGMT_OP_USER_PASSKEY_NEG_REPLY);
4305 4306
}

4307 4308 4309 4310 4311 4312 4313 4314 4315 4316 4317 4318 4319 4320 4321 4322
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);
}

4323
int mgmt_auth_failed(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4324
		     u8 addr_type, u8 status)
4325 4326 4327
{
	struct mgmt_ev_auth_failed ev;

4328
	bacpy(&ev.addr.bdaddr, bdaddr);
4329
	ev.addr.type = link_to_bdaddr(link_type, addr_type);
4330
	ev.status = mgmt_status(status);
4331

4332
	return mgmt_event(MGMT_EV_AUTH_FAILED, hdev, &ev, sizeof(ev), NULL);
4333
}
4334

4335 4336 4337
int mgmt_auth_enable_complete(struct hci_dev *hdev, u8 status)
{
	struct cmd_lookup match = { NULL, hdev };
4338 4339
	bool changed = false;
	int err = 0;
4340 4341 4342 4343

	if (status) {
		u8 mgmt_err = mgmt_status(status);
		mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev,
4344
				     cmd_status_rsp, &mgmt_err);
4345 4346 4347
		return 0;
	}

4348 4349 4350 4351 4352 4353 4354 4355
	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;
	}

4356
	mgmt_pending_foreach(MGMT_OP_SET_LINK_SECURITY, hdev, settings_rsp,
4357
			     &match);
4358

4359 4360
	if (changed)
		err = new_settings(hdev, match.sk);
4361 4362 4363 4364 4365 4366 4367

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

	return err;
}

4368
static void clear_eir(struct hci_request *req)
4369
{
4370
	struct hci_dev *hdev = req->hdev;
4371 4372
	struct hci_cp_write_eir cp;

4373
	if (!lmp_ext_inq_capable(hdev))
4374
		return;
4375

4376 4377
	memset(hdev->eir, 0, sizeof(hdev->eir));

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

4380
	hci_req_add(req, HCI_OP_WRITE_EIR, sizeof(cp), &cp);
4381 4382
}

4383
int mgmt_ssp_enable_complete(struct hci_dev *hdev, u8 enable, u8 status)
4384 4385
{
	struct cmd_lookup match = { NULL, hdev };
4386
	struct hci_request req;
4387 4388
	bool changed = false;
	int err = 0;
4389 4390 4391

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

		if (enable && test_and_clear_bit(HCI_SSP_ENABLED,
4394
						 &hdev->dev_flags))
4395 4396
			err = new_settings(hdev, NULL);

4397 4398
		mgmt_pending_foreach(MGMT_OP_SET_SSP, hdev, cmd_status_rsp,
				     &mgmt_err);
4399 4400 4401 4402 4403 4404 4405 4406 4407 4408

		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;
4409 4410 4411 4412
	}

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

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

4416
	if (match.sk)
4417 4418
		sock_put(match.sk);

4419 4420
	hci_req_init(&req, hdev);

4421
	if (test_bit(HCI_SSP_ENABLED, &hdev->dev_flags))
4422
		update_eir(&req);
4423
	else
4424 4425 4426
		clear_eir(&req);

	hci_req_run(&req, NULL);
4427

4428 4429 4430
	return err;
}

4431
static void sk_lookup(struct pending_cmd *cmd, void *data)
4432 4433 4434 4435 4436 4437 4438 4439 4440
{
	struct cmd_lookup *match = data;

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

4441
int mgmt_set_class_of_dev_complete(struct hci_dev *hdev, u8 *dev_class,
4442
				   u8 status)
4443
{
4444 4445
	struct cmd_lookup match = { NULL, hdev, mgmt_status(status) };
	int err = 0;
4446

4447 4448 4449
	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);
4450 4451

	if (!status)
4452 4453
		err = mgmt_event(MGMT_EV_CLASS_OF_DEV_CHANGED, hdev, dev_class,
				 3, NULL);
4454 4455 4456

	if (match.sk)
		sock_put(match.sk);
4457 4458 4459 4460

	return err;
}

4461
int mgmt_set_local_name_complete(struct hci_dev *hdev, u8 *name, u8 status)
4462 4463
{
	struct mgmt_cp_set_local_name ev;
4464
	struct pending_cmd *cmd;
4465

4466 4467
	if (status)
		return 0;
4468 4469 4470

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

4473
	cmd = mgmt_pending_find(MGMT_OP_SET_LOCAL_NAME, hdev);
4474 4475
	if (!cmd) {
		memcpy(hdev->dev_name, name, sizeof(hdev->dev_name));
4476

4477 4478 4479 4480 4481
		/* 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;
4482
	}
4483

4484 4485
	return mgmt_event(MGMT_EV_LOCAL_NAME_CHANGED, hdev, &ev, sizeof(ev),
			  cmd ? cmd->sk : NULL);
4486
}
4487

4488
int mgmt_read_local_oob_data_reply_complete(struct hci_dev *hdev, u8 *hash,
4489
					    u8 *randomizer, u8 status)
4490 4491 4492 4493
{
	struct pending_cmd *cmd;
	int err;

4494
	BT_DBG("%s status %u", hdev->name, status);
4495

4496
	cmd = mgmt_pending_find(MGMT_OP_READ_LOCAL_OOB_DATA, hdev);
4497 4498 4499 4500
	if (!cmd)
		return -ENOENT;

	if (status) {
4501 4502
		err = cmd_status(cmd->sk, hdev->id, MGMT_OP_READ_LOCAL_OOB_DATA,
				 mgmt_status(status));
4503 4504 4505 4506 4507 4508
	} else {
		struct mgmt_rp_read_local_oob_data rp;

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

4509
		err = cmd_complete(cmd->sk, hdev->id,
4510 4511
				   MGMT_OP_READ_LOCAL_OOB_DATA, 0, &rp,
				   sizeof(rp));
4512 4513 4514 4515 4516 4517
	}

	mgmt_pending_remove(cmd);

	return err;
}
4518

4519
int mgmt_device_found(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4520 4521
		      u8 addr_type, u8 *dev_class, s8 rssi, u8 cfm_name, u8
		      ssp, u8 *eir, u16 eir_len)
4522
{
4523 4524
	char buf[512];
	struct mgmt_ev_device_found *ev = (void *) buf;
4525
	size_t ev_size;
4526

4527 4528 4529
	if (!hci_discovery_active(hdev))
		return -EPERM;

4530 4531
	/* Leave 5 bytes for a potential CoD field */
	if (sizeof(*ev) + eir_len + 5 > sizeof(buf))
4532 4533
		return -EINVAL;

4534 4535
	memset(buf, 0, sizeof(buf));

4536
	bacpy(&ev->addr.bdaddr, bdaddr);
4537
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4538
	ev->rssi = rssi;
4539
	if (cfm_name)
4540
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_CONFIRM_NAME);
4541
	if (!ssp)
4542
		ev->flags |= __constant_cpu_to_le32(MGMT_DEV_FOUND_LEGACY_PAIRING);
4543

4544
	if (eir_len > 0)
4545
		memcpy(ev->eir, eir, eir_len);
4546

4547 4548
	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,
4549
					  dev_class, 3);
4550

4551
	ev->eir_len = cpu_to_le16(eir_len);
4552
	ev_size = sizeof(*ev) + eir_len;
4553

4554
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev, ev_size, NULL);
4555
}
4556

4557
int mgmt_remote_name(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 link_type,
4558
		     u8 addr_type, s8 rssi, u8 *name, u8 name_len)
4559
{
4560 4561 4562
	struct mgmt_ev_device_found *ev;
	char buf[sizeof(*ev) + HCI_MAX_NAME_LENGTH + 2];
	u16 eir_len;
4563

4564
	ev = (struct mgmt_ev_device_found *) buf;
4565

4566 4567 4568
	memset(buf, 0, sizeof(buf));

	bacpy(&ev->addr.bdaddr, bdaddr);
4569
	ev->addr.type = link_to_bdaddr(link_type, addr_type);
4570 4571 4572
	ev->rssi = rssi;

	eir_len = eir_append_data(ev->eir, 0, EIR_NAME_COMPLETE, name,
4573
				  name_len);
4574

4575
	ev->eir_len = cpu_to_le16(eir_len);
4576

4577
	return mgmt_event(MGMT_EV_DEVICE_FOUND, hdev, ev,
4578
			  sizeof(*ev) + eir_len, NULL);
4579
}
4580

4581
int mgmt_discovering(struct hci_dev *hdev, u8 discovering)
4582
{
4583
	struct mgmt_ev_discovering ev;
4584 4585
	struct pending_cmd *cmd;

4586 4587
	BT_DBG("%s discovering %u", hdev->name, discovering);

4588
	if (discovering)
4589
		cmd = mgmt_pending_find(MGMT_OP_START_DISCOVERY, hdev);
4590
	else
4591
		cmd = mgmt_pending_find(MGMT_OP_STOP_DISCOVERY, hdev);
4592 4593

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

4596 4597
		cmd_complete(cmd->sk, hdev->id, cmd->opcode, 0, &type,
			     sizeof(type));
4598 4599 4600
		mgmt_pending_remove(cmd);
	}

4601 4602 4603 4604 4605
	memset(&ev, 0, sizeof(ev));
	ev.type = hdev->discovery.type;
	ev.discovering = discovering;

	return mgmt_event(MGMT_EV_DISCOVERING, hdev, &ev, sizeof(ev), NULL);
4606
}
4607

4608
int mgmt_device_blocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4609 4610 4611 4612
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_blocked ev;

4613
	cmd = mgmt_pending_find(MGMT_OP_BLOCK_DEVICE, hdev);
4614

4615 4616
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4617

4618
	return mgmt_event(MGMT_EV_DEVICE_BLOCKED, hdev, &ev, sizeof(ev),
4619
			  cmd ? cmd->sk : NULL);
4620 4621
}

4622
int mgmt_device_unblocked(struct hci_dev *hdev, bdaddr_t *bdaddr, u8 type)
4623 4624 4625 4626
{
	struct pending_cmd *cmd;
	struct mgmt_ev_device_unblocked ev;

4627
	cmd = mgmt_pending_find(MGMT_OP_UNBLOCK_DEVICE, hdev);
4628

4629 4630
	bacpy(&ev.addr.bdaddr, bdaddr);
	ev.addr.type = type;
4631

4632
	return mgmt_event(MGMT_EV_DEVICE_UNBLOCKED, hdev, &ev, sizeof(ev),
4633
			  cmd ? cmd->sk : NULL);
4634
}